init.c 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. #include <stm32f10x_flash.h>
  2. #include <stm32f10x_rcc.h>
  3. #include <stm32f10x_gpio.h>
  4. #include <stm32f10x_tim.h>
  5. #include <stm32f10x_usart.h>
  6. #include <stm32f10x_adc.h>
  7. #include <stm32f10x.h>
  8. #include <stm32f10x_dma.h>
  9. #include <stm32f10x_spi.h>
  10. #include <misc.h>
  11. #include "init.h"
  12. #include "radio.h"
  13. SPI_InitTypeDef SPI_InitStructure;
  14. USART_InitTypeDef USART_InitStructure;
  15. GPIO_InitTypeDef GPIO_Conf;
  16. ADC_InitTypeDef ADC_InitStructure;
  17. DMA_InitTypeDef DMA_InitStructure;
  18. __IO uint16_t ADCVal[2];
  19. #define ADC1_DR_Address ((uint32_t)0x4001244C)
  20. #if defined(STM32F10X_CL)
  21. #error "clock oscillator problem!"
  22. #endif
  23. void init_usart_gps (const uint32_t speed, const uint8_t enable_irq)
  24. {
  25. NVIC_DisableIRQ(USART1_IRQn);
  26. USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);
  27. USART_ClearITPendingBit(USART1, USART_IT_RXNE);
  28. USART_ClearITPendingBit(USART1, USART_IT_ORE);
  29. USART_Cmd(USART1, DISABLE);
  30. RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
  31. USART_InitStructure.USART_BaudRate = speed;
  32. USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  33. USART_InitStructure.USART_StopBits = USART_StopBits_1;
  34. USART_InitStructure.USART_Parity = USART_Parity_No;
  35. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  36. USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
  37. USART_Init(USART1, &USART_InitStructure);
  38. NVIC_InitTypeDef NVIC_InitStructure; /* create NVIC structure */
  39. NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  40. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 15;
  41. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
  42. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  43. NVIC_Init(&NVIC_InitStructure);
  44. USART_Cmd(USART1, ENABLE);
  45. if (enable_irq)
  46. {
  47. USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
  48. NVIC_EnableIRQ(USART1_IRQn);
  49. }
  50. }
  51. void init_usart_debug (void)
  52. {
  53. NVIC_DisableIRQ(USART3_IRQn);
  54. USART_Cmd(USART3, DISABLE);
  55. RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
  56. USART_InitStructure.USART_BaudRate = 19200; //0x9c4;
  57. USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  58. USART_InitStructure.USART_StopBits = USART_StopBits_1;
  59. USART_InitStructure.USART_Parity = USART_Parity_No;
  60. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  61. USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
  62. USART_Init(USART3, &USART_InitStructure);
  63. USART_Cmd(USART3, ENABLE);
  64. }
  65. void NVIC_Conf (void)
  66. {
  67. #ifdef VECT_TAB_RAM
  68. NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
  69. #else // VECT_TAB_FLASH
  70. NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
  71. #endif
  72. }
  73. void RCC_Conf (void)
  74. {
  75. ErrorStatus HSEStartUpStatus;
  76. RCC_DeInit();
  77. RCC_HSEConfig(RCC_HSE_ON);
  78. HSEStartUpStatus = RCC_WaitForHSEStartUp();
  79. if (HSEStartUpStatus == SUCCESS)
  80. {
  81. FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
  82. FLASH_SetLatency(FLASH_Latency_2);
  83. RCC_HCLKConfig(RCC_SYSCLK_Div4);
  84. RCC_PCLK2Config(RCC_HCLK_Div4);
  85. RCC_PCLK1Config(RCC_HCLK_Div2);
  86. RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE);
  87. while(RCC_GetSYSCLKSource() != 0x04);
  88. }
  89. }
  90. void init_port (void)
  91. {
  92. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  93. GPIO_Conf.GPIO_Pin = GPIO_Pin_12;
  94. GPIO_Conf.GPIO_Mode = GPIO_Mode_Out_PP;
  95. GPIO_Conf.GPIO_Speed = GPIO_Speed_10MHz;
  96. GPIO_Init(GPIOA, &GPIO_Conf);
  97. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  98. GPIO_Conf.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8;
  99. GPIO_Conf.GPIO_Mode = GPIO_Mode_Out_PP;
  100. GPIO_Conf.GPIO_Speed = GPIO_Speed_10MHz;
  101. GPIO_Init(GPIOB, &GPIO_Conf);
  102. // SPI2_SCK & SPI2_MOSI
  103. GPIO_Conf.GPIO_Pin = GPIO_Pin_13 | radioSDIpin;
  104. GPIO_Conf.GPIO_Mode = GPIO_Mode_AF_PP;
  105. GPIO_Conf.GPIO_Speed = GPIO_Speed_10MHz;
  106. GPIO_Init(GPIOB, &GPIO_Conf);
  107. // SPI2_MISO
  108. GPIO_Conf.GPIO_Pin = GPIO_Pin_14;
  109. GPIO_Conf.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  110. GPIO_Init(GPIOB, &GPIO_Conf);
  111. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
  112. // radioNSELpin
  113. GPIO_Conf.GPIO_Pin = radioNSELpin;
  114. GPIO_Conf.GPIO_Mode = GPIO_Mode_Out_PP;
  115. GPIO_Conf.GPIO_Speed = GPIO_Speed_10MHz;
  116. GPIO_Init(GPIOC,&GPIO_Conf);
  117. spi_init();
  118. GPIO_Conf.GPIO_Pin = GPIO_Pin_9;
  119. GPIO_Conf.GPIO_Mode = GPIO_Mode_AF_PP;
  120. GPIO_Conf.GPIO_Speed = GPIO_Speed_10MHz;
  121. GPIO_Init(GPIOA, &GPIO_Conf);
  122. GPIO_Conf.GPIO_Pin = GPIO_Pin_10;
  123. GPIO_Conf.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  124. GPIO_Init(GPIOA, &GPIO_Conf);
  125. init_usart_gps(9600, 0);
  126. GPIO_Conf.GPIO_Pin = GPIO_Pin_10;
  127. GPIO_Conf.GPIO_Mode = GPIO_Mode_AF_PP;
  128. GPIO_Conf.GPIO_Speed = GPIO_Speed_10MHz;
  129. GPIO_Init(GPIOB, &GPIO_Conf);
  130. GPIO_Conf.GPIO_Pin = GPIO_Pin_11;
  131. GPIO_Conf.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  132. GPIO_Init(GPIOB, &GPIO_Conf);
  133. init_usart_debug();
  134. RCC_AHBPeriphClockCmd ( RCC_AHBPeriph_DMA1 , ENABLE ) ;
  135. DMA_DeInit(DMA1_Channel1);
  136. DMA_InitStructure.DMA_BufferSize = 2;
  137. DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
  138. DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  139. DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t) &ADCVal;
  140. ADC_DMACmd(ADC1, ENABLE);
  141. DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
  142. DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  143. DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
  144. DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
  145. DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
  146. DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  147. DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  148. DMA_Init(DMA1_Channel1, &DMA_InitStructure);
  149. DMA_Cmd(DMA1_Channel1, ENABLE);
  150. GPIO_Conf.GPIO_Mode = GPIO_Mode_AIN;
  151. GPIO_Conf.GPIO_Pin = GPIO_Pin_6 ; // that's ADC1 (PA5 on STM32)
  152. GPIO_Init(GPIOA, &GPIO_Conf);
  153. GPIO_Conf.GPIO_Mode = GPIO_Mode_AIN;
  154. GPIO_Conf.GPIO_Pin = GPIO_Pin_5 ; // that's ADC1 (PA3 on STM32)
  155. GPIO_Init(GPIOA, &GPIO_Conf);
  156. RCC_ADCCLKConfig (RCC_PCLK2_Div2);
  157. RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
  158. ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
  159. ADC_InitStructure.ADC_ScanConvMode = ENABLE;
  160. ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; // we work in continuous sampling mode
  161. ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
  162. ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  163. ADC_InitStructure.ADC_NbrOfChannel = 2;
  164. ADC_Init ( ADC1, &ADC_InitStructure); // set config of ADC1
  165. ADC_RegularChannelConfig(ADC1,ADC_Channel_5, 1,ADC_SampleTime_28Cycles5); // define regular conversion config
  166. ADC_RegularChannelConfig(ADC1,ADC_Channel_6, 2,ADC_SampleTime_28Cycles5); // define regular conversion config
  167. ADC_DMACmd(ADC1, ENABLE);
  168. ADC_Cmd (ADC1,ENABLE); // enable ADC
  169. ADC_ResetCalibration(ADC1); // Reset previous calibration
  170. while (ADC_GetResetCalibrationStatus(ADC1)) continue;
  171. ADC_StartCalibration(ADC1); // start new calibration (ADC must be off at that time)
  172. while (ADC_GetCalibrationStatus(ADC1)) continue;
  173. ADC_SoftwareStartConvCmd(ADC1, ENABLE); // start conversion (will be endless as we are in continuous mode)
  174. }
  175. void spi_init (void)
  176. {
  177. GPIO_Conf.GPIO_Pin = radioSDIpin;
  178. GPIO_Conf.GPIO_Mode = GPIO_Mode_AF_PP;
  179. GPIO_Conf.GPIO_Speed = GPIO_Speed_10MHz;
  180. GPIO_Init(GPIOB, &GPIO_Conf);
  181. RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
  182. SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  183. SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  184. SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;
  185. SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
  186. SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
  187. SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;
  188. SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  189. SPI_InitStructure.SPI_CRCPolynomial = 7;
  190. SPI_Init(SPI2, &SPI_InitStructure);
  191. SPI_SSOutputCmd(SPI2, ENABLE);
  192. SPI_Cmd(SPI2, ENABLE);
  193. SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  194. SPI_Init(SPI2, &SPI_InitStructure);
  195. }
  196. void spi_deinit (void)
  197. {
  198. SPI_I2S_DeInit(SPI2);
  199. GPIO_Conf.GPIO_Pin = radioSDIpin;
  200. GPIO_Conf.GPIO_Mode = GPIO_Mode_Out_PP;
  201. GPIO_Conf.GPIO_Speed = GPIO_Speed_10MHz;
  202. GPIO_Init(GPIOB, &GPIO_Conf);
  203. }
  204. void init_timer(const int rtty_speed)
  205. {
  206. TIM_TimeBaseInitTypeDef TIM2_TimeBaseInitStruct;
  207. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
  208. RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM2, DISABLE);
  209. TIM2_TimeBaseInitStruct.TIM_Prescaler = 6 - 1; // tick every 1/1000000 s
  210. TIM2_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
  211. TIM2_TimeBaseInitStruct.TIM_Period = (uint16_t) ((1000000 / rtty_speed) - 1);
  212. TIM2_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
  213. TIM2_TimeBaseInitStruct.TIM_RepetitionCounter = 0;
  214. TIM_TimeBaseInit(TIM2,&TIM2_TimeBaseInitStruct);
  215. TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
  216. TIM_ITConfig(TIM2,TIM_IT_Update, ENABLE);
  217. NVIC_InitTypeDef NVIC_InitStructure; //create NVIC structure
  218. NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
  219. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  220. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  221. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  222. NVIC_Init(&NVIC_InitStructure);
  223. TIM_Cmd(TIM2,ENABLE);
  224. }