老版本GCU
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

259 lines
10 KiB

  1. /************************************************************************
  2. * 模块名称:main.c
  3. * 程序功能:
  4. * 编 写 者:
  5. * 编写日期:2017-06-22
  6. * 修 改 者:
  7. * 修改日期:
  8. * 编译环境:KEIL4 MDK ARM V4.74
  9. * 硬件平台:STM32F103ZCT6
  10. ************************************************************************/
  11. /************************************************************************/
  12. /* */
  13. /* INCLUDES */
  14. /* */
  15. /************************************************************************/
  16. #include <stdio.h>
  17. #include <stm32f10x.h>
  18. #include <stm32f10x_dma.h>
  19. #include "share.h"
  20. #include "com.h"
  21. #include "stm32f10x_iwdg.h"
  22. /************************************************************************/
  23. /* */
  24. /* DEFINITION */
  25. /* */
  26. /************************************************************************/
  27. /************************************************************************/
  28. /* */
  29. /* DECLARATION */
  30. /* */
  31. /************************************************************************/
  32. void Init(void);
  33. void HFL_Init_RCC(void);
  34. void HFL_Init_GPIO(void);
  35. void HFL_Init_NVIC(void);
  36. void HFL_Init_USART(void);
  37. void HFL_Init_SYSTICK(void);
  38. //void HFL_Init_IWDG(void);
  39. /************************************************************************/
  40. /* */
  41. /* VARIABLE */
  42. /* */
  43. /************************************************************************/
  44. volatile u32 g_SysTick = 0;
  45. uint8_t Dma_Rx_Buffer[DMA_RECV_BUF_SIZE]; //, Dma_Rx_num;
  46. uint8_t Dma_Tx_Buffer[DMA_SEND_BUF_SIZE];
  47. /************************************************************************/
  48. /* */
  49. /* IMPLEMENTATION */
  50. /* */
  51. /************************************************************************/
  52. /***********************************************************************
  53. * 函 数 名: main()
  54. * 功能描述:
  55. * 函数说明:
  56. * 输 入: 无
  57. * 返 回:
  58. * 设 计 者:TNT 日期:2015-07-22
  59. * 修 改 者:TNT 日期:2015-07-22
  60. ***********************************************************************/
  61. int main(void)
  62. {
  63. Init();
  64. AFL_Start_BootLoader();
  65. }
  66. /***********************************************************************
  67. * 函 数 名: Init()
  68. * 功能描述:
  69. * 函数说明:
  70. * 输 入: 无
  71. * 返 回:
  72. * 设 计 者:TNT 日期:2014-01-12
  73. * 修 改 者:TNT 日期:2014-01-12
  74. ***********************************************************************/
  75. void Init(void)
  76. {
  77. __enable_fiq();//开启中断 1017
  78. HFL_Init_RCC();
  79. HFL_Init_GPIO();
  80. HFL_Init_SYSTICK();
  81. HFL_Init_USART();
  82. HFL_Init_NVIC();
  83. }
  84. /***********************************************************************
  85. * 函 数 名: HFL_Init_RCC()
  86. * 功能描述: 时钟
  87. * 函数说明: 根据硬件需要另行具由针对性的设置
  88. * 输 入: 无
  89. * 返 回:
  90. * 设 计 者:TNT 日期:2014-01-12
  91. * 修 改 者:TNT 日期:2014-01-12
  92. ***********************************************************************/
  93. void HFL_Init_RCC(void)
  94. {
  95. SystemInit();
  96. RCC_ADCCLKConfig(RCC_PCLK2_Div8);
  97. RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
  98. RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE); //enable uart4
  99. RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE); //dma2
  100. RCC_APB2PeriphClockCmd( RCC_APB2Periph_USART1 | RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC, ENABLE);
  101. RCC_ClearFlag();
  102. }
  103. /***********************************************************************
  104. * 函 数 名: void SysTick_Init()
  105. * 功能描述: 系统时钟
  106. * 函数说明:
  107. * 输 入: 无
  108. * 返 回:
  109. * 设 计 者:TNT 日期:2014-01-12
  110. * 修 改 者:TNT 日期:2014-01-12
  111. ***********************************************************************/
  112. void HFL_Init_SYSTICK(void)
  113. {
  114. SysTick_Config(SystemCoreClock/1000); //1ms响应一次中断
  115. SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);
  116. }
  117. /***********************************************************************
  118. * 函 数 名: HFL_Init_NVIC()
  119. * 功能描述:
  120. * 函数说明:
  121. * 输 入: 无
  122. * 返 回:
  123. * 设 计 者:TNT 日期:2014-01-12
  124. * 修 改 者:TNT 日期:2014-01-12
  125. ***********************************************************************/
  126. void HFL_Init_NVIC(void)
  127. {
  128. NVIC_InitTypeDef NVIC_InitStructure;
  129. //NVIC_SetVectorTable( NVIC_VectTab_FLASH, 0x0);
  130. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //设置优先级分组
  131. /* Enable and configure RCC global IRQ channel */
  132. NVIC_InitStructure.NVIC_IRQChannel = USART_IRQ;
  133. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  134. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  135. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  136. NVIC_Init(&NVIC_InitStructure);
  137. NVIC_InitStructure.NVIC_IRQChannel = USART_DMA_IRQ_RX;
  138. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  139. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  140. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  141. NVIC_Init(&NVIC_InitStructure);
  142. NVIC_InitStructure.NVIC_IRQChannel = USART_DMA_IRQ_TX;
  143. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  144. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
  145. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  146. NVIC_Init(&NVIC_InitStructure);
  147. }
  148. /***********************************************************************
  149. * 函 数 名: HFL_Init_USART1()
  150. * 功能描述:
  151. * 函数说明:
  152. * 输 入: 无
  153. * 返 回:
  154. * 设 计 者:TNT 日期:2014-01-12
  155. * 修 改 者:TNT 日期:2014-01-12
  156. ***********************************************************************/
  157. void HFL_Init_USART(void)
  158. {
  159. USART_InitTypeDef USART_InitStructure;
  160. DMA_InitTypeDef DMA_InitStructure; //定义DMA初始化结构体
  161. // USART init
  162. USART_InitStructure.USART_BaudRate = USART_BAUDRATE;
  163. USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  164. USART_InitStructure.USART_StopBits = USART_StopBits_1;
  165. USART_InitStructure.USART_Parity = USART_Parity_No;
  166. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  167. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  168. USART_Init(USART_NUM, &USART_InitStructure); //init
  169. // 串口-interrupt
  170. USART_ITConfig(USART_NUM, USART_IT_RXNE , DISABLE); //recv
  171. USART_ITConfig(USART_NUM, USART_IT_TC, DISABLE);// 使能串口发送完成中断
  172. USART_ITConfig(USART_NUM, USART_IT_IDLE, ENABLE); // 采用空闲中断,目的是在产生空闲中断时,说明接收或者发送已经结束,此时可以读取DMA中的数据了
  173. USART_Cmd(USART_NUM, ENABLE);//使能串口
  174. USART_ClearFlag(USART_NUM, USART_FLAG_TC); //clear flag
  175. //init dma for usart
  176. /* DMA1 Channel5 (triggered by USART1 Rx event) Config */
  177. DMA_DeInit(USART_DMA_CHANNEL_RX); //重置DMA 2通道配置
  178. DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&USART_NUM->DR);// 初始化外设地址,相当于“哪家快递”
  179. DMA_InitStructure.DMA_MemoryBaseAddr =(uint32_t)Dma_Rx_Buffer;// 内存地址,相当于几号柜
  180. DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//外设作为数据来源,即为收快递
  181. DMA_InitStructure.DMA_BufferSize = DMA_RECV_BUF_SIZE;// 缓存容量,即柜子大小
  182. DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; // 外设地址不递增,即柜子对应的快递不变
  183. DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;// 内存递增
  184. DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //外设字节宽度,即快递运输快件大小度量(按重量算,还是按体积算)
  185. DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;// 内存字节宽度,即店主封装快递的度量(按重量,还是按体质进行封装)
  186. DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;// 正常模式,即满了就不在接收了,而不是循环存储
  187. DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;// 优先级很高,对应快递就是加急
  188. DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; // 内存与外设通信,而非内存到内存
  189. DMA_Init(USART_DMA_CHANNEL_RX, &DMA_InitStructure);// 把参数初始化,即拟好与快递公司的协议
  190. DMA_ITConfig(USART_DMA_CHANNEL_RX, DMA_IT_TC, ENABLE); //开USART2 Rx DMA中断 //开启传输缓冲完成中断
  191. DMA_ITConfig(USART_DMA_CHANNEL_RX, DMA_IT_TE, ENABLE); //通道 dma 传输错误中断
  192. DMA_Cmd(USART_DMA_CHANNEL_RX, ENABLE);// 启动DMA,即与快递公司签订合同,正式生效
  193. /* DMA1 Channel4 (triggered by USART1 Tx event) Config */
  194. DMA_DeInit(USART_DMA_CHANNEL_TX);
  195. DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&USART_NUM->DR); // 外设地址,串口1, 即发件的快递
  196. DMA_InitStructure.DMA_MemoryBaseAddr =(u32)Dma_Tx_Buffer;// 发送内存地址
  197. DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;// 外设为传送数据目的地,即发送数据,即快递是发件
  198. DMA_InitStructure.DMA_BufferSize = 0; //发送长度为0,即未有快递需要发送
  199. DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;// 正常模式,即满了就不在接收了,而不是循环存储
  200. DMA_Init(USART_DMA_CHANNEL_TX, &DMA_InitStructure);//初始化
  201. DMA_ITConfig(USART_DMA_CHANNEL_TX, DMA_IT_TC, ENABLE); //开USART2 Tx DMA中断 //开启传输缓冲完成中断
  202. DMA_ITConfig(USART_DMA_CHANNEL_TX, DMA_IT_TE, ENABLE); //通道 dma 传输错误中断
  203. DMA_Cmd(USART_DMA_CHANNEL_TX, ENABLE);
  204. USART_DMACmd(USART_NUM, USART_DMAReq_Tx|USART_DMAReq_Rx, ENABLE);// 使能DMA串口发送和接受请求
  205. }
  206. /***********************************************************************
  207. * 函 数 名: HFL_Init_GPIO()
  208. * 功能描述: IO口
  209. * 函数说明:
  210. * 输 入: 无
  211. * 返 回:
  212. * 设 计 者:TNT 日期:2014-01-12
  213. * 修 改 者:TNT 日期:2014-01-12
  214. ***********************************************************************/
  215. void HFL_Init_GPIO(void)
  216. {
  217. GPIO_InitTypeDef GPIO_InitStructure;
  218. /* Disable the Serial Wire Jtag Debug Port SWJ-DP */
  219. // GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable | GPIO_Remap_USART1 , ENABLE); //???
  220. // 串口配置,工控机串口
  221. /* Configure USART Tx as alternate function push-pull */
  222. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_Tx;
  223. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  224. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  225. GPIO_Init(GPIO_Remap_Tx, &GPIO_InitStructure);
  226. /* Configure USART Rx as input floating */
  227. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_Rx;
  228. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  229. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  230. GPIO_Init(GPIO_Remap_Rx, &GPIO_InitStructure);
  231. }
  232. /******************* (C) COPYRIGHT 2017 LECOOAI *****END OF FILE****/