资源下载:

STM32_Project_key-uart.zip

bsp_key.h

  1. #ifndef __BSP_KEY_H
  2. #define __BSP_KEY_H
  3. #include "stm32f10x.h"
  4. #define KEY_WAIT_INPUT 0
  5. #define KEY_CONFIRM_INPUT 1
  6. #define KEY_RE_CONFIRM_INPUT 2
  7. #define KEY_RELEASE 3
  8. // 宏定义按键1
  9. #define KEY1_GPIO_PIN GPIO_Pin_0
  10. #define KEY1_GPIO_PORT GPIOA
  11. #define KEY1_GPIO_CLK RCC_APB2Periph_GPIOA
  12. // 宏定义按键2
  13. #define KEY2_GPIO_PIN GPIO_Pin_1
  14. #define KEY2_GPIO_PORT GPIOA
  15. #define KEY2_GPIO_CLK RCC_APB2Periph_GPIOA
  16. // 宏定义按键3
  17. #define KEY3_GPIO_PIN GPIO_Pin_2
  18. #define KEY3_GPIO_PORT GPIOA
  19. #define KEY3_GPIO_CLK RCC_APB2Periph_GPIOA
  20. // 宏定义按键4
  21. #define KEY4_GPIO_PIN GPIO_Pin_3
  22. #define KEY4_GPIO_PORT GPIOA
  23. #define KEY4_GPIO_CLK RCC_APB2Periph_GPIOA
  24. // 宏定义按键5
  25. #define KEY5_GPIO_PIN GPIO_Pin_4
  26. #define KEY5_GPIO_PORT GPIOA
  27. #define KEY5_GPIO_CLK RCC_APB2Periph_GPIOA
  28. #define KEY_ON 1
  29. #define KEY_OFF 0
  30. void KEY_GPIO_Config(void);
  31. uint8_t Key_Scan(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
  32. uint8_t Key_Scan_DownUp(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
  33. #endif // __BSP_KEY_H

bsp_key.c

  1. #include "bsp_key.h"
  2. // 按钮配置
  3. void KEY_GPIO_Config(void)
  4. {
  5. GPIO_InitTypeDef GPIO_InitStruct;
  6. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  7. // 配置5个按键的引脚
  8. GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;
  9. GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU; // 下拉输入
  10. GPIO_Init(GPIOA, &GPIO_InitStruct);
  11. }
  12. extern uint8_t sw1_flag;
  13. /**
  14. * @brief 检测SW1按键
  15. * @param
  16. *
  17. * @retval
  18. */
  19. void Scan_sw1(void)
  20. {
  21. static uint16_t key_time=0;
  22. static uint8_t key_state=0;
  23. static uint8_t signal=0;
  24. uint8_t key_data;
  25. GPIO_SetBits(GPIOA, GPIO_Pin_0);
  26. key_data = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0);
  27. switch(key_state)
  28. {
  29. case KEY_WAIT_INPUT://wait key input
  30. if(key_data == 0)
  31. key_state = KEY_CONFIRM_INPUT;
  32. break;
  33. case KEY_CONFIRM_INPUT://confirm key input
  34. if(key_data == 0)
  35. {
  36. key_state = KEY_RE_CONFIRM_INPUT;
  37. }
  38. else
  39. {
  40. key_state = KEY_WAIT_INPUT;
  41. }
  42. break;
  43. case KEY_RE_CONFIRM_INPUT://re-confirm key_input
  44. {
  45. static uint8_t cnt=0;
  46. if(key_data == 0)
  47. {
  48. if(key_time++ > 20)
  49. {
  50. key_time = 0;
  51. cnt = 0;
  52. signal = 1;
  53. //sw1_flag = 1;
  54. //按键标志
  55. //key_state = KEY_RE_CONFIRM_INPUT;
  56. }
  57. }
  58. else
  59. {
  60. if(signal)
  61. {
  62. if(cnt++ > 5)
  63. {
  64. cnt=0;
  65. signal=0;
  66. sw1_flag = 1;
  67. key_state = KEY_WAIT_INPUT;
  68. }
  69. }
  70. }
  71. }
  72. break;
  73. default:
  74. break;
  75. }
  76. }
  77. /**
  78. * 按键2
  79. */
  80. extern uint8_t sw2_flag;
  81. void Scan_sw2(void)
  82. {
  83. static uint16_t key_time2 = 0;
  84. static uint8_t key_state2 = 0;
  85. static uint8_t signal2 = 0;
  86. uint8_t key_data;
  87. GPIO_SetBits(GPIOA, GPIO_Pin_1);
  88. key_data = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1);
  89. switch(key_state2)
  90. {
  91. case KEY_WAIT_INPUT://wait key input
  92. if(key_data == 0)
  93. key_state2 = KEY_CONFIRM_INPUT;
  94. break;
  95. case KEY_CONFIRM_INPUT://confirm key input
  96. if(key_data == 0)
  97. {
  98. key_state2 = KEY_RE_CONFIRM_INPUT;
  99. }
  100. else
  101. {
  102. key_state2 = KEY_WAIT_INPUT;
  103. }
  104. break;
  105. case KEY_RE_CONFIRM_INPUT://re-confirm key_input
  106. {
  107. static uint8_t cnt=0;
  108. if(key_data == 0)
  109. {
  110. if(key_time2++ > 20)
  111. {
  112. key_time2 = 0;
  113. cnt = 0;
  114. signal2 = 1;
  115. //按键标志
  116. //key_state = KEY_RE_CONFIRM_INPUT;
  117. }
  118. }
  119. else
  120. {
  121. if(signal2)
  122. {
  123. if(cnt++ > 5)
  124. {
  125. cnt=0;
  126. signal2=0;
  127. sw2_flag = 1;
  128. key_state2 = KEY_WAIT_INPUT;
  129. }
  130. }
  131. }
  132. }
  133. break;
  134. default:
  135. break;
  136. }
  137. }
  138. /**
  139. * 按键3
  140. */
  141. extern uint8_t sw3_flag;
  142. void Scan_sw3(void)
  143. {
  144. static uint16_t key_time3 = 0;
  145. static uint8_t key_state3 = 0;
  146. static uint8_t signal3 = 0;
  147. uint8_t key_data;
  148. GPIO_SetBits(GPIOA, GPIO_Pin_2);
  149. key_data = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2);
  150. switch(key_state3)
  151. {
  152. case KEY_WAIT_INPUT://wait key input
  153. if(key_data == 0)
  154. key_state3 = KEY_CONFIRM_INPUT;
  155. break;
  156. case KEY_CONFIRM_INPUT://confirm key input
  157. if(key_data == 0)
  158. {
  159. key_state3 = KEY_RE_CONFIRM_INPUT;
  160. }
  161. else
  162. {
  163. key_state3 = KEY_WAIT_INPUT;
  164. }
  165. break;
  166. case KEY_RE_CONFIRM_INPUT://re-confirm key_input
  167. {
  168. static uint8_t cnt=0;
  169. if(key_data == 0)
  170. {
  171. if(key_time3++ > 20)
  172. {
  173. key_time3 = 0;
  174. cnt = 0;
  175. signal3 = 1;
  176. //按键标志
  177. //key_state = KEY_RE_CONFIRM_INPUT;
  178. }
  179. }
  180. else
  181. {
  182. if(signal3)
  183. {
  184. if(cnt++ > 5)
  185. {
  186. cnt=0;
  187. signal3=0;
  188. sw3_flag = 1;
  189. key_state3 = KEY_WAIT_INPUT;
  190. }
  191. }
  192. }
  193. }
  194. break;
  195. default:
  196. break;
  197. }
  198. }
  199. /**
  200. * 按键4
  201. */
  202. extern uint8_t sw4_flag;
  203. void Scan_sw4(void)
  204. {
  205. static uint16_t key_time4 = 0;
  206. static uint8_t key_state4 = 0;
  207. static uint8_t signal4 = 0;
  208. uint8_t key_data;
  209. GPIO_SetBits(GPIOA, GPIO_Pin_3);
  210. key_data = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3);
  211. switch(key_state4)
  212. {
  213. case KEY_WAIT_INPUT://wait key input
  214. if(key_data == 0)
  215. key_state4 = KEY_CONFIRM_INPUT;
  216. break;
  217. case KEY_CONFIRM_INPUT://confirm key input
  218. if(key_data == 0)
  219. {
  220. key_state4 = KEY_RE_CONFIRM_INPUT;
  221. }
  222. else
  223. {
  224. key_state4 = KEY_WAIT_INPUT;
  225. }
  226. break;
  227. case KEY_RE_CONFIRM_INPUT://re-confirm key_input
  228. {
  229. static uint8_t cnt=0;
  230. if(key_data == 0)
  231. {
  232. if(key_time4++ > 20)
  233. {
  234. key_time4 = 0;
  235. cnt = 0;
  236. signal4 = 1;
  237. //按键标志
  238. //key_state = KEY_RE_CONFIRM_INPUT;
  239. }
  240. }
  241. else
  242. {
  243. if(signal4)
  244. {
  245. if(cnt++ > 5)
  246. {
  247. cnt=0;
  248. signal4=0;
  249. sw4_flag = 1;
  250. key_state4 = KEY_WAIT_INPUT;
  251. }
  252. }
  253. }
  254. }
  255. break;
  256. default:
  257. break;
  258. }
  259. }
  260. /**
  261. * 按键5
  262. */
  263. extern uint8_t sw5_flag;
  264. void Scan_sw5(void)
  265. {
  266. static uint16_t key_time5 = 0;
  267. static uint8_t key_state5 = 0;
  268. static uint8_t signal5 = 0;
  269. uint8_t key_data;
  270. GPIO_SetBits(GPIOA, GPIO_Pin_4);
  271. key_data = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_4);
  272. switch(key_state5)
  273. {
  274. case KEY_WAIT_INPUT://wait key input
  275. if(key_data == 0)
  276. key_state5 = KEY_CONFIRM_INPUT;
  277. break;
  278. case KEY_CONFIRM_INPUT://confirm key input
  279. if(key_data == 0)
  280. {
  281. key_state5 = KEY_RE_CONFIRM_INPUT;
  282. }
  283. else
  284. {
  285. key_state5 = KEY_WAIT_INPUT;
  286. }
  287. break;
  288. case KEY_RE_CONFIRM_INPUT://re-confirm key_input
  289. {
  290. static uint8_t cnt=0;
  291. if(key_data == 0)
  292. {
  293. if(key_time5++ > 20)
  294. {
  295. key_time5 = 0;
  296. cnt = 0;
  297. signal5 = 1;
  298. //按键标志
  299. //key_state = KEY_RE_CONFIRM_INPUT;
  300. }
  301. }
  302. else
  303. {
  304. if(signal5)
  305. {
  306. if(cnt++ > 5)
  307. {
  308. cnt=0;
  309. signal5=0;
  310. sw5_flag = 1;
  311. key_state5 = KEY_WAIT_INPUT;
  312. }
  313. }
  314. }
  315. }
  316. break;
  317. default:
  318. break;
  319. }
  320. }

bsp_DMAusart1.h

  1. #ifndef __BSP_DMAUSART1_H
  2. #define __BSP_DMAUSART1_H
  3. //-------------------------------------------------------------------
  4. //#include "main.h"
  5. //#include "stm32f10x_dma.h"
  6. #include "stm32f10x.h"
  7. #include <string.h>
  8. //-------------------------------------------------------------------
  9. #define USART1_REC_LEN 58 //定义最大接收字节数 58
  10. typedef struct
  11. {
  12. uint8_t Tx_buf[USART1_REC_LEN]; //发送缓冲区
  13. uint8_t Tx_len; //发送长度
  14. uint8_t Rx_buf[USART1_REC_LEN]; //接收缓冲区
  15. uint8_t Rx_len; //接收长度
  16. uint8_t Rx_end_flag; //接收完成标志
  17. uint8_t Rx_time_start; //计时启动标志
  18. uint16_t Rx_time; //1祯数据接收时长(mSec)
  19. }USART1_DEF;
  20. extern USART1_DEF OneUART;
  21. //-------------------------------------------------------------------
  22. void USART1_Init(uint32_t BAND,uint8_t *SendAddres,uint8_t *RecAddres,uint8_t len);
  23. void DMA_USART1RxTx_Init(uint8_t *SendAd,uint8_t *RecAddres,uint8_t len);
  24. void NVIC_USART1_Configuration(void);
  25. void USART1_SendChar(u8 t);
  26. void USART_printf(USART_TypeDef* USARTx, uint8_t *Data,...);
  27. void USART1_SendString(void* buffer, uint16_t size);
  28. void USART1_Encryption_SendString(void* buffer, uint16_t size);
  29. uint16_t USART1_DMASendString(void* buffer, uint16_t size);
  30. uint16_t USART1_Encryption_DMASendString(void* buffer, uint16_t size);
  31. #endif /* __USART1_H */

bsp_DMAusart1.c

#include "bsp_DMAusart1.h"

USART1_DEF OneUART;
/**
* @brief  USART1初始化
* @param  BAND,波特率(2400,4800,9600,38400,115200)
*         Send_pf,发送数据缓冲区
*         Rec_pf,接收数据缓冲区
*         buf_len,接收数据缓冲区长度
* @retval 无
*/
void USART1_Init(uint32_t BAND,uint8_t *Send_pf,uint8_t *Rec_pf,uint8_t buf_len)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;

    /* config USART1 clock */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOB, ENABLE);

    /* USART1 GPIO config */

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//使能端口重映射

    /* Configure USART1 Tx (PB6) as alternate function push-pull */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    /* Configure USART1 Rx (PB7) as input floating */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

     /* RS485,Tx/Rx Control PB5 */
     GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_5;
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
     GPIO_Init(GPIOB, &GPIO_InitStructure);
    GPIO_ResetBits(GPIOB,GPIO_Pin_5);

    GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);    


    /* USART1 mode config */
    USART_InitStructure.USART_BaudRate = BAND;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No ;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

    USART_Init(USART1, &USART_InitStructure); 
    USART_Cmd(USART1, ENABLE);



    USART_ClearFlag(USART1, USART_FLAG_TC);             //清发送完成标志
    USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);        //开启空闲中断
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);        //开启接收中断
    USART_ITConfig(USART1, USART_IT_TC, ENABLE);        //开启发送完成中断
    NVIC_USART1_Configuration();

    DMA_USART1RxTx_Init(Send_pf,Rec_pf,buf_len);//DMA初始化

}


/**
* @brief  配置USART1中断
* @param  
* @retval 无
*/
static void NVIC_USART1_Configuration(void)
{
    NVIC_InitTypeDef NVIC_InitStructure; 
    /* Configure the NVIC Preemption Priority Bits */  
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

    /* Enable the USARTy Interrupt */
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;         //开启接收完成中断
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

    /* Enable the USARTy Interrupt */
    NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel4_IRQn;//开启发送完成中断 
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}

/**
* @brief  DMA_USART1初始化
* @param  Send_pf,发送数据缓冲区
*         Rec_pf,接收数据缓冲区
*         buf_len,接收数据缓冲区长度
* @retval 无
*/
static void DMA_USART1RxTx_Init(uint8_t *Send_pf,uint8_t *Rec_pf,uint8_t buf_len)
{    
    DMA_InitTypeDef DMA_InitStructure;
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
    DMA_Cmd(DMA1_Channel5,DISABLE);                                             //关闭DMA
    DMA_DeInit(DMA1_Channel5);                                                    //恢复默认
    DMA_InitStructure.DMA_PeripheralBaseAddr=(u32)&USART1->DR;                    //设置串口发送数据寄存器            
    DMA_InitStructure.DMA_MemoryBaseAddr=(u32)Rec_pf;                             //设置发送缓冲区首地址        
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;                            //设置外设位目标,内存缓冲区 <- 外设寄存器
    DMA_InitStructure.DMA_BufferSize=buf_len;                                    //需要发送的字节数,这里其实可以设置为0,因为在实际要发送的时候,会重新设置次值
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;            //外设地址不递增
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;                        //内存递增
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;        //外设字节宽度
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;                //内存字节宽度
    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;                                 //正常模式 
    DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;                        //高优先级
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                                 //关闭内存到内存的DMA模式
    DMA_Init(DMA1_Channel5,&DMA_InitStructure);                                 //配置DMA1的6通道 
    DMA_Cmd(DMA1_Channel5,ENABLE);                                              //使能DMA

    DMA_DeInit(DMA1_Channel4);
    DMA_InitStructure.DMA_PeripheralBaseAddr= (u32)&USART1->DR;                    //初始化外设地址            
    DMA_InitStructure.DMA_MemoryBaseAddr=(u32)Send_pf;                             //内存地址        
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;                            //外设作为数据来源
    DMA_InitStructure.DMA_BufferSize=0;                                            //发送长度为0
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;            //外设地址不递增
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;                        //内存递增
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;        //外设字节宽度
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;                //内存字节宽度
    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;                                 //正常模式 
    DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;                        //高优先级
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                                 //关闭内存到内存的DMA模式    
    DMA_Init(DMA1_Channel4,&DMA_InitStructure);                                 //配置DMA1的7通道
    DMA_Cmd(DMA1_Channel4,ENABLE);                                              //使能DMA

    USART_ITConfig(USART1, USART_DMAReq_Tx, ENABLE);                               //开启中断USART_DMAReq_Tx
    USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE);                                  //开启接收接收
    USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);                                  //开启接收发送
//    DMA_ITConfig(DMA1_Channel4,DMA_IT_TC,ENABLE);                               //配置DMA发送完成后产生中断

}
 /**
  * @brief  USART1_DMA发送完成中断
  * @param  无
  * @retval 无
  */
void DMA1_Channel4_IRQHandler(void)
{
    if(DMA_GetFlagStatus(DMA1_FLAG_TC4)!=RESET)
    {//发送完成中断
        DMA_ClearFlag(DMA1_FLAG_TC4);
        //GPIO_ResetBits(GPIOB,GPIO_Pin_5);
    }
}
 /**
  * @brief  USART1串口接收中断
  * @param  无
  * @retval 无
  */
void USART1_IRQHandler(void)                    //串口1中断服务程序
{
    static uint8_t LEN = 0;
    uint8_t Clear = Clear,tmp;
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) 
    {//接收中断     
        OneUART.Rx_buf[LEN++]= USART1->DR;            //读取接收到的数据
        LEN= (LEN < USART1_REC_LEN)?LEN:0;
    }else if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)
    {//空闲中断,1桢数据接收完毕
        Clear=USART1->SR;    //读SR寄存器
        Clear=USART1->DR;    //读DR寄存器,(先读SR,再读DR就是清除IDLE标志中断)
        OneUART.Rx_end_flag  = 1;                //接收完成标志
        DMA_Cmd(DMA1_Channel5,DISABLE); 
        OneUART.Rx_len=USART1_REC_LEN-DMA_GetCurrDataCounter(DMA1_Channel5);
        DMA_SetCurrDataCounter(DMA1_Channel5,USART1_REC_LEN); //设置DMA缓冲区长度
        DMA_Cmd(DMA1_Channel5,ENABLE);    
    }else if(USART_GetITStatus(USART1, USART_IT_TC) != RESET)    
    {//发送完成中断 
        USART_ClearITPendingBit(USART1, USART_IT_TC);    //清除USART1发送完成中断标志
        DMA_ClearFlag(DMA1_FLAG_TC4);                    //清零标志位
        GPIO_ResetBits(GPIOB,GPIO_Pin_5);                //发送完成,等待接收数据

    }
}


 /**
  * @brief  DMA_USART1数据发送
  * @param  buffer,发送数据地址
  *         size,发送数据长度
  * @retval size
  */
uint16_t USART1_DMASendString(void* buffer, uint16_t size)
{
      if(!size) return 0;                                                    //判断长度是否有效
      while(DMA_GetCurrDataCounter(DMA1_Channel4));                            //检查DMA通道内是否还有数据
      if(buffer) //发送数据拷贝到发送缓存区
          memcpy(OneUART.Tx_buf, buffer,(size > 1024?1024:size));
      DMA_Cmd(DMA1_Channel4, DISABLE);                                        //DMA发送数据要先关闭,设置发送数据长度  开启DMA
      DMA1_Channel4->CNDTR = size;                                            //设置发送长度
      GPIO_SetBits(GPIOB,GPIO_Pin_5); 
      DMA_Cmd(DMA1_Channel4, ENABLE);                                          //启动DMA发送
      return size;
}

 /**
  * @brief  DMA_USART1加密数据发送
  * @param  buffer,发送数据地址
  *         size,发送数据长度
  * @retval size
  */
uint16_t USART1_Encryption_DMASendString(void* buffer, uint16_t size)
{
      if(!size) return 0;                                                    //判断长度是否有效
      while(DMA_GetCurrDataCounter(DMA1_Channel4));                            //检查DMA通道内是否还有数据
      if(buffer) //发送数据拷贝到发送缓存区
      {
          //encryption(buffer,size);//使能加密
          memcpy(OneUART.Tx_buf, buffer,(size > 1024?1024:size));    
      }     
      DMA_Cmd(DMA1_Channel4, DISABLE);                                        //DMA发送数据要先关闭,设置发送数据长度  开启DMA
      DMA1_Channel4->CNDTR = size;                                            //设置发送长度
      GPIO_SetBits(GPIOB,GPIO_Pin_5); 
      DMA_Cmd(DMA1_Channel4, ENABLE);                                          //启动DMA发送
      return size;
}

 /**
  * @brief  USART1发送数据1个字节
  * @param  dat,发送数据
  * @retval 无
  */
void  USART1_SendChar(u8 t)
{
    USART_SendData(USART1,t);
    while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
    while((USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET));//等待串口发送完毕
}

 /**
  * @brief  USART1发送字符串
  * @param  dat,发送数据
  * @retval 无
  */
void USART1_SendString(void* buffer, uint16_t size)
{
    uint8_t i=0,*buf;
    buf=buffer;
     GPIO_SetBits(GPIOB,GPIO_Pin_5);  
     while(size--)
     {
         USART1_SendChar(buf[i++]);
     }
     GPIO_ResetBits(GPIOB,GPIO_Pin_5);
}

 /**
  * @brief  USART1加密发送字符串
  * @param  dat,发送数据
  * @retval 无
  */
void USART1_Encryption_SendString(void* buffer, uint16_t size)
{
    uint8_t i=0,*buf;
    //encryption(buffer,size);
    buf=buffer;
     GPIO_SetBits(GPIOB,GPIO_Pin_5);  
     while(size--)
     {
         USART1_SendChar(buf[i++]);
     }
     GPIO_ResetBits(GPIOB,GPIO_Pin_5);
}

bsp_nixie_tube.h

#ifndef __BSP_NIXIE_TUBE_H
#define __BSP_NIXIE_TUBE_H

#include "stm32f10x.h"

#define get_bit(dat, bit)    ((dat & (1<<bit))>>bit)
#define OPEN 1
#define CLOCK 0


// 关闭数码管
#define SET_TUBE_CLOSE()    GPIO_ResetBits(GPIOB, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2);\
                            GPIO_ResetBits(GPIOA, GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_15);

//#define SET_TUBE_BLACK_B GPIO_ResetBits(GPIOB, GPIO_Pin_0 | GPIO_Pin_1);
//#define SET_TUBE_BLACK_A GPIO_ResetBits(GPIOA, GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_15);

// 数码管片选开关
#define     CHIP_1(OPEN_OR_CLOCK)    if(OPEN_OR_CLOCK)     GPIO_ResetBits(GPIOA, GPIO_Pin_5);\
                                                                else GPIO_SetBits(GPIOA, GPIO_Pin_5)
#define     CHIP_2(OPEN_OR_CLOCK)    if(OPEN_OR_CLOCK)     GPIO_ResetBits(GPIOA, GPIO_Pin_6);\
                                                                else GPIO_SetBits(GPIOA, GPIO_Pin_6)
#define     CHIP_3(OPEN_OR_CLOCK)    if(OPEN_OR_CLOCK)     GPIO_ResetBits(GPIOA, GPIO_Pin_7);\
                                                                else GPIO_SetBits(GPIOA, GPIO_Pin_7)
#define     CHIP_4(OPEN_OR_CLOCK)    if(OPEN_OR_CLOCK)     GPIO_ResetBits(GPIOA, GPIO_Pin_8);\
                                                                else GPIO_SetBits(GPIOA, GPIO_Pin_8)

// 点亮数码管
#define     SET_TUBE_LIGHT(num) \
                                GPIO_SetBits(GPIOA, \
                                    ((get_bit(num, 0) << 9)) | /*GPIO_Pin_9  a*/ \
                                    ((get_bit(num, 1) << 10)) | /*GPIO_Pin_10  b*/ \
                                    ((get_bit(num, 2) << 11)) | /*GPIO_Pin_11  c*/ \
                                    ((get_bit(num, 3) << 12)) | /*GPIO_Pin_12  d*/ \
                                    ((get_bit(num, 4) << 15)));/*GPIO_Pin_15  e*/ \
                                GPIO_SetBits(GPIOB, (get_bit(num, 5) << 0) | /*GPIO_Pin_0 f*/ \
                                                    (get_bit(num, 6) << 1)  /*GPIO_Pin_1 g*/ );  //   


void Nixie_Tube_GPIO_Config(void);
void Show_Number(uint16_t number, uint8_t isOpen, uint8_t isOpenPoint);

#endif // __BSP_NIXIE_TUBE_H

bsp_nixie_tube.c

#include "bsp_nixie_tube.h"

// 共阳数码管真值表 0 1 2 3 4 5 6 7 8 9 A b C d E F H L ^ U P
uint8_t smgduan[21] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,
                                           0x88,0x83,0xC6,0xA1,0x86,0x8E,0x89, 0xC7, 0xC8, 0xC1,0x8C};


// 初始化GPIO引脚
void Nixie_Tube_GPIO_Config(void)
{

    GPIO_InitTypeDef  GPIO_InitStruct;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);


    // 配置5个按键的引脚
    GPIO_InitStruct.GPIO_Pin = (GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 |GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_15 | GPIO_Pin_12);

    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出
    GPIO_Init(GPIOA, &GPIO_InitStruct);

    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出
    GPIO_InitStruct.GPIO_Pin = (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2);// | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_8 | GPIO_Pin_9);
    GPIO_Init(GPIOB, &GPIO_InitStruct);

}


// 点亮数码管
void SET_Tube_Light(uint8_t num)
{
    SET_TUBE_LIGHT(num);
}


extern uint8_t nixit_tube1;
// 数码管上显示的数据
void Show_Number(uint16_t number, uint8_t isOpen, uint8_t isOpenPoint)
{
    static uint8_t n1 = 0;
    static uint8_t n2 = 0;
    static uint8_t n3 = 0;
    static uint8_t n4 = 0;

    // 取数值
    uint8_t number_4 = smgduan[number % 10];
    uint8_t number_3 = smgduan[(number/10) % 10];
    uint8_t number_2 = smgduan[((number/10)/10) % 10];
    uint8_t number_1 = smgduan[number/1000];


//    uint8_t number_4 = smgduan[number & 0x0f];
//    uint8_t number_3 = smgduan[(number >> 4) & 0x0f];
//    uint8_t number_2 = smgduan[(number >> 8) & 0x0f];
//    uint8_t number_1 = smgduan[(number >> 12) & 0x0f];
    //GPIO_ResetBits(GPIOB, GPIO_Pin_2);
    //GPIO_SetBits(GPIOB, GPIO_Pin_2);
    // 第一个开始亮
    if(nixit_tube1 == 1)
    {
        // 关闭上一个
        SET_TUBE_CLOSE();
        CHIP_4(CLOCK);

        // 打开当前
        CHIP_1(OPEN);
        SET_TUBE_LIGHT(number_1);

        if( !get_bit(isOpenPoint, 3) ) // 数码管下的点是否开启
            GPIO_SetBits(GPIOB, GPIO_Pin_2);
    }

    // 第二个开始亮
    if(nixit_tube1 == 2)
    {
        // 关闭上一个
        SET_TUBE_CLOSE();
        CHIP_1(CLOCK);

        // 打开当前
        CHIP_2(OPEN);
        SET_TUBE_LIGHT(number_2);// SET_Tube(number_2);

        if( !get_bit(isOpenPoint, 2) )
            GPIO_SetBits(GPIOB, GPIO_Pin_2);
    }


    if(nixit_tube1 == 3)
    {
        SET_TUBE_CLOSE();
        CHIP_2(CLOCK);

        CHIP_3(OPEN);
        SET_TUBE_LIGHT(number_3); // SET_Tube(number_3);

        if( !get_bit(isOpenPoint, 1) )
            GPIO_SetBits(GPIOB, GPIO_Pin_2);
    }

    if(nixit_tube1 == 4)
    {

        SET_TUBE_CLOSE();
        CHIP_3(CLOCK);

        CHIP_4(OPEN);
        SET_TUBE_LIGHT(number_4); // SET_Tube(number_4);

        if( !get_bit(isOpenPoint, 0) )
            GPIO_SetBits(GPIOB, GPIO_Pin_2);
    }

}

bsp_crc.h

#ifndef __BSP_CRC_H
#define __BSP_CRC_H

#include "stm32f10x.h"


uint16_t crc16ForModbus(uint8_t *data, uint16_t size);

#endif //__BSP_CRC_H

bsp_crc.h

#include "bsp_crc.h"


uint16_t crc16ForModbus(uint8_t *data, uint16_t size)
{
    static const uint16_t crc16Table[] =
    {
        0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241,
        0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440,
        0xCC01, 0x0CC0, 0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE81, 0x0E40,
        0x0A00, 0xCAC1, 0xCB81, 0x0B40, 0xC901, 0x09C0, 0x0880, 0xC841,
        0xD801, 0x18C0, 0x1980, 0xD941, 0x1B00, 0xDBC1, 0xDA81, 0x1A40,
        0x1E00, 0xDEC1, 0xDF81, 0x1F40, 0xDD01, 0x1DC0, 0x1C80, 0xDC41,
        0x1400, 0xD4C1, 0xD581, 0x1540, 0xD701, 0x17C0, 0x1680, 0xD641,
        0xD201, 0x12C0, 0x1380, 0xD341, 0x1100, 0xD1C1, 0xD081, 0x1040,
        0xF001, 0x30C0, 0x3180, 0xF141, 0x3300, 0xF3C1, 0xF281, 0x3240,
        0x3600, 0xF6C1, 0xF781, 0x3740, 0xF501, 0x35C0, 0x3480, 0xF441,
        0x3C00, 0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0, 0x3E80, 0xFE41,
        0xFA01, 0x3AC0, 0x3B80, 0xFB41, 0x3900, 0xF9C1, 0xF881, 0x3840,
        0x2800, 0xE8C1, 0xE981, 0x2940, 0xEB01, 0x2BC0, 0x2A80, 0xEA41,
        0xEE01, 0x2EC0, 0x2F80, 0xEF41, 0x2D00, 0xEDC1, 0xEC81, 0x2C40,
        0xE401, 0x24C0, 0x2580, 0xE541, 0x2700, 0xE7C1, 0xE681, 0x2640,
        0x2200, 0xE2C1, 0xE381, 0x2340, 0xE101, 0x21C0, 0x2080, 0xE041,
        0xA001, 0x60C0, 0x6180, 0xA141, 0x6300, 0xA3C1, 0xA281, 0x6240,
        0x6600, 0xA6C1, 0xA781, 0x6740, 0xA501, 0x65C0, 0x6480, 0xA441,
        0x6C00, 0xACC1, 0xAD81, 0x6D40, 0xAF01, 0x6FC0, 0x6E80, 0xAE41,
        0xAA01, 0x6AC0, 0x6B80, 0xAB41, 0x6900, 0xA9C1, 0xA881, 0x6840,
        0x7800, 0xB8C1, 0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A80, 0xBA41,
        0xBE01, 0x7EC0, 0x7F80, 0xBF41, 0x7D00, 0xBDC1, 0xBC81, 0x7C40,
        0xB401, 0x74C0, 0x7580, 0xB541, 0x7700, 0xB7C1, 0xB681, 0x7640,
        0x7200, 0xB2C1, 0xB381, 0x7340, 0xB101, 0x71C0, 0x7080, 0xB041,
        0x5000, 0x90C1, 0x9181, 0x5140, 0x9301, 0x53C0, 0x5280, 0x9241,
        0x9601, 0x56C0, 0x5780, 0x9741, 0x5500, 0x95C1, 0x9481, 0x5440,
        0x9C01, 0x5CC0, 0x5D80, 0x9D41, 0x5F00, 0x9FC1, 0x9E81, 0x5E40,
        0x5A00, 0x9AC1, 0x9B81, 0x5B40, 0x9901, 0x59C0, 0x5880, 0x9841,
        0x8801, 0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1, 0x8A81, 0x4A40,
        0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80, 0x8C41,
        0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641,
        0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x8081, 0x4040
    };

    uint8_t buf;
    uint16_t crc16 = 0xFFFF;

    for ( uint16_t i = 0; i < size; ++i )
    {
        buf = data[i] ^ crc16;
        crc16 >>= 8;
        crc16 ^= crc16Table[ buf ];
    }

    return (crc16>>8 | crc16<<8);
}

main.c

/**********************
芯片:STM32F103C8T6

实现功能:

引脚:
***********************/

#include "stm32f10x.h"
#include "main.h"
#include "bsp_DMAusart1.h"
#include "bsp_tim3.h"
#include "bsp_key.h"
#include "bsp_nixie_tube.h"
#include "bsp_crc.h"


extern void Scan_sw1(void);    
extern void Scan_sw2(void);    
extern void Scan_sw3(void);    
extern void Scan_sw4(void);    
extern void Scan_sw5(void);    
extern uint8_t Scan_key_flag;


int main()
{

    uint8_t a = 0;  

    uint8_t twinkle = 0x0f; // 4个数码管亮灭控制

    static uint16_t timCount = 0; // 计数


    USART1_Init(9600, OneUART.Tx_buf, OneUART.Rx_buf, USART1_REC_LEN);
    USART1_DMASendString("AppStart!", sizeof("AppStart!"));



    TIM3_Int_Init(71,999);
    //KEY_GPIO_Config();  // 初始化按键的GPIO
    //Nixie_Tube_GPIO_Config();  // 初始化数码管GPIO
    //USART1_Init(9600, OneUART.Tx_buf, OneUART.Rx_buf, USART1_REC_LEN);  // 初始化USART1
    //TIM3_Int_Init(9999, 71); // 1ms

    while(1)
    {
        // 检测按键
        if(Scan_key_flag)
        {
            change++; // 实时显示数据跳动
            if(change > 3000)
            {
                change = 0;
            }

            if(timCount == 0)
            {
                Test2++;
            }
            timCount++;     // 发送数据计时


            // 数码管计时
            nixit_tube1++;    
            if(nixit_tube1 > 4) nixit_tube1 =1;

            // 按键扫描
            Scan_key_flag=0;
            Scan_sw1();
            Scan_sw2();
            Scan_sw3();
            Scan_sw4();
            Scan_sw5(); 

            // 数码管显示
            Show_Number(data, twinkle, isOpenPoint); // 4个参数控制数码管亮灭 1 1 1 1

            // 长时间未按按键则跳回实时显示状态
            back_jump_realData_flag++;
        }

        if((OneUART.Rx_buf[0] == 0x08) && (OneUART.Rx_buf[1] == 0x03) && (OneUART.Rx_len > 8))
        {
            // 当按键连续按的时候,则不再更新数据
            if(time_key_flag >= 2)
            {
                time_key_flag = 0;
                OneLiftData = (OneUART.Rx_buf[3] << 8) | OneUART.Rx_buf[4]; // 将目前的数据赋值到要变化的数据
                OneConveyorData = (OneUART.Rx_buf[5] << 8) | OneUART.Rx_buf[6];
                TwoLiftData = (OneUART.Rx_buf[7] << 8) | OneUART.Rx_buf[8];
                TwoConveyorData = (OneUART.Rx_buf[9] << 8) | OneUART.Rx_buf[10];
            }
        }

        switch(flag_status)
        {
            case enum_REAL_TIMER_DATA: // 实时显示数据
                realTime();
                break;
            case enum_OneLifterDelayStatTime: // 1号罐升降机延时启动时间
                //data = (OneUART.Rx_buf[3] << 8) | OneUART.Rx_buf[4];
                data = OneLiftData;
                isOpenPoint = 0x08;
                break;
            case enum_OneConveyorCloseDelayTime: // 1号传送带关闭延迟时间
                //data = (OneUART.Rx_buf[5] << 8) | OneUART.Rx_buf[6];
                data = OneConveyorData;
                isOpenPoint = 0x08;
                break;
            case enum_TwoLifterDelayStatTime: // 2号罐升降机延时启动时间
                //data = (OneUART.Rx_buf[7] << 8) | OneUART.Rx_buf[8];
                data = TwoLiftData;
                isOpenPoint = 0x04;
                break;
            case enum_TwoConveyorCloseDelayTime: // 2号传送带关闭延迟时间
                //data = (OneUART.Rx_buf[9] << 8) | OneUART.Rx_buf[10];
                data = TwoConveyorData;
                isOpenPoint = 0x04;
                break;
            case enum_SET_WAIT_Status: // 设置等待状态
                data = 2222;
                isOpenPoint = 0x0f;
                break;
            case enum_SET_Reset:         // 复位
                data = 9999;
                isOpenPoint = 0x0f;
                break;
            case enum_SET_Def:              // 恢复出厂设置
                data = 7777;
                isOpenPoint = 0x0f;
                break;
            case enum_OneDelayTim:         // 切换状态至1号罐升降机延时启动时间
                data = 1177;
                isOpenPoint = 0x08;
                break;
            case enum_OneCloseDelayTim: // 切换状态至1号传送带关闭延迟时间
                data = 1188;
                isOpenPoint = 0x08;
                break;
            case enum_TwoDelayTim:         // 切换状态至2号罐升降机延时启动时间
                data = 2277;
                isOpenPoint = 0x04;
                break;
            case enum_TwoCloseDelayTim: // 切换状态至2号传送带关闭延迟时间
                data = 2288;
                isOpenPoint = 0x04;
                break;
            case enum_InputSetDef:         // 切换状态至复位
                data = 3333;
                isOpenPoint = 0x0f;
                break;
            case enum_InputFactorySet: // 切换状态至出厂设置
                data = 4444;
                isOpenPoint = 0x0f;
                break;
            default:
                break;
        }


        // 发送数据出去
        if( OneUART.Rx_end_flag) // 判断是否可以发送数据
        {// 实时数据
            uint16_t crc; // CRC校验
            uint8_t *buffer;

            // 判断是否接收到的数据为02开头的数据
            if(OneUART.Rx_buf[0] == 0x01) //  || (OneUART.Rx_buf[0] == 0x01)
            { // 实时数据

                if(timCount> 680) // 延迟发送时间
                {
                    time_key_flag++;
                    Test++;
                    buffer = readData; // 要向设备发送的数据
                    crc = crc16ForModbus(buffer, TxDataSize);

                    buffer[6] = crc >>8;  // 高8位
                    buffer[7] = (uint8_t)crc; // 低8位

                    OneUART.Rx_end_flag = 0;
                    timCount = 0;

                    USART1_DMASendString(buffer, TxDataSize + 2);
                    *OneUART.Rx_buf = 0;

                }
            }
            else if(OneUART.Rx_buf[0] == 0x02)
            { // 控制指令

                if(timCount > 710) // 延迟发送时间 850
                {
                    if(send_flag == 1) // 复位
                    {

                        send_flag = 0;
                        buffer = DefVal;
                        crc = crc16ForModbus(buffer, TxDataSize);
                        buffer[6] = crc >>8;  // 高8位
                        buffer[7] = (uint8_t)crc; // 低8位

                        OneUART.Rx_end_flag = 0;
                        timCount = 0;

                        USART1_DMASendString(buffer, TxDataSize + 2);
                        *OneUART.Rx_buf = 0;
                    }
                    else if(send_flag == 2) // 恢复出厂设置
                    {
                        send_flag = 0;
                        buffer = factorySet;


                        crc = crc16ForModbus(buffer, TxDataSize);

                        buffer[6] = crc >>8;  // 高8位
                        buffer[7] = (uint8_t)crc; // 低8位

                        OneUART.Rx_end_flag = 0;
                        timCount = 0;

                        USART1_DMASendString(buffer, TxDataSize + 2);
                        *OneUART.Rx_buf = 0;
                    }
                    else if(send_flag == 3)    // 1号罐升降机延时启动时间
                    {
                        send_flag = 0;
                        buffer = OneStartTime;

                        buffer[4] = (uint8_t) OneLiftData>>8;
                        buffer[5] = (uint8_t) OneLiftData;
                        crc = crc16ForModbus(buffer, TxDataSize);

                        buffer[6] = crc >>8;  // 高8位
                        buffer[7] = (uint8_t)crc; // 低8位

                        OneUART.Rx_end_flag = 0;
                        timCount = 0;

                        USART1_DMASendString(buffer, TxDataSize + 2);
                        *OneUART.Rx_buf = 0;
                    }
                    else if(send_flag == 4) // 1号传送带关闭延迟时间
                    {
                        send_flag = 0;
                        buffer = OneDelayTime;

                        buffer[4] = (uint8_t) OneConveyorData>>8;
                        buffer[5] = (uint8_t) OneConveyorData;
                        crc = crc16ForModbus(buffer, TxDataSize);

                        buffer[6] = crc >>8;  // 高8位
                        buffer[7] = (uint8_t)crc; // 低8位

                        OneUART.Rx_end_flag = 0;
                        timCount = 0;

                        USART1_DMASendString(buffer, TxDataSize + 2);
                        *OneUART.Rx_buf = 0;
                    }
                    else if(send_flag == 5) // 2号罐升降机延时启动时间
                    {
                        send_flag = 0;
                        buffer = TwoStartTime;

                        buffer[4] = (uint8_t) TwoLiftData>>8;
                        buffer[5] = (uint8_t) TwoLiftData;
                        crc = crc16ForModbus(buffer, TxDataSize);

                        buffer[6] = crc >>8;  // 高8位
                        buffer[7] = (uint8_t)crc; // 低8位

                        OneUART.Rx_end_flag = 0;
                        timCount = 0;

                        USART1_DMASendString(buffer, TxDataSize + 2);
                        *OneUART.Rx_buf = 0;
                    }
                    else if(send_flag == 6) // 2号传送带关闭延迟时间
                    {
                        send_flag = 0;
                        buffer = TwoDelayTime;

                        buffer[4] = (uint8_t) TwoConveyorData>>8;
                        buffer[5] = (uint8_t) TwoConveyorData;
                        crc = crc16ForModbus(buffer, TxDataSize);

                        buffer[6] = crc >>8;  // 高8位
                        buffer[7] = (uint8_t)crc; // 低8位

                        OneUART.Rx_end_flag = 0;
                        timCount = 0;

                        USART1_DMASendString(buffer, TxDataSize + 2);
                        *OneUART.Rx_buf = 0;
                    }
                    else
                    {
                        *OneUART.Rx_buf = 0;
                        OneUART.Rx_end_flag = 0;
                        timCount = 0;
//                        USART1_DMASendString("tim", sizeof("tim"));
                    }

                }
            }
        }

        if(back_jump_realData_flag == 10000)
        {
            back_jump_realData_flag = 0;
            key_status1 = 0;
            key_status2 = 0;
            key_status3 = 0;
            key_status4 = 0;
            key_status5 = 0;
        }


         // 按了按键1    -------- 设置键 等待设置
         if( sw1_flag)
         {

             sw1_flag = 0;
             key_status1++;
             if(key_status1 == 2)
             {
                 // 退出设置
                 key_status1 = 0;
             }

             key_status2 = 0;
             key_status3 = 0;
             key_status4 = 0;
             key_status5 = 0;
             back_jump_realData_flag = 0;

         }

         // 按了按键5 --------- 确认设置
         if( sw5_flag)
         {
             sw5_flag = 0;
             if(key_status5 == 4)
             {
                 key_status5 = 3;
             }
             key_status5++;
             back_jump_realData_flag = 0;
         }

         // 按了按键4 ---------- 切换
         if( sw4_flag)
         {
             sw4_flag = 0;
             key_status4++;
             key_status5 = 3;
             if(key_status4 == 6)
             {
                 key_status4 = 0;
             }
             back_jump_realData_flag = 0;
         }

         // 按了按键3 ---------- 减按键
         if( sw3_flag )
         {
             a--;
             sw3_flag = 0;
             key_status3 = 1;
             back_jump_realData_flag = 0;
         }

         // 按了按键2 ---------- 加按键
         if( sw2_flag )
         {
             a++;
             sw2_flag = 0;
             key_status2 = 1;
             back_jump_realData_flag = 0;
         }

         // 数码管显示
        tube_dataShow();

    }

}

// 数码管数据显示
void tube_dataShow(void)
{
     if(key_status1 == 1)
     {// 进入设置

         if(key_status5 == 1 || key_status5 >= 3)
         {// 进入确定设置

             if(key_status4 == 0)
             {// 进入切换 1号罐升降机启动时间

                 if(key_status5 == 4)
                 {// 进入确认设置

                     if(key_status2 == 1)
                     {
                         // 加操作
                         key_status2 = 0;
                         send_flag = 3;
                         OneLiftData++;
                         time_key_flag = 0;
                     }

                     if(key_status3 == 1)
                     {
                         // 减操作
                         key_status3 = 0;
                         send_flag = 3;
                         OneLiftData--;
                         time_key_flag = 0;
                     }
                     //data = OneLiftData;
                     flag_status = enum_OneLifterDelayStatTime;
                     return;
                 }
                 flag_status = enum_OneDelayTim; 
                 return;
                 //break;
             }else if(key_status4 == 1)
             {
                 // 进入切换 1号传送带关闭延时时间
                 if(key_status5 == 4)
                 {// 进入确认设置

                     if(key_status2 == 1)
                     {
                         // 加操作
                         key_status2 = 0;
                         send_flag = 4;
                         OneConveyorData++;
                         time_key_flag = 0;
                     }

                     if(key_status3 == 1)
                     {
                         // 减操作
                         key_status3 = 0;
                         send_flag = 4;
                         OneConveyorData--;
                         time_key_flag = 0;
                     }
                     //data = OneConveyorData;
                     flag_status = enum_OneConveyorCloseDelayTime;
                     return;
                 }
                 flag_status = enum_OneCloseDelayTim;
                 return;

             }else if(key_status4 == 2)
             {
                 // 进入切换 2号罐升降机启动时间
                 if(key_status5 == 4)
                 {// 进入确认设置


                     if(key_status2 == 1)
                     {
                         // 加操作
                         key_status2 = 0;
                         send_flag = 5;
                         TwoLiftData++;
                         time_key_flag = 0;
                     }

                     if(key_status3 == 1)
                     {
                         // 减操作
                         key_status3 = 0;
                         send_flag = 5;
                         TwoLiftData--;
                         time_key_flag = 0;
                     }
                     //data = TwoLiftData;
                     flag_status = enum_TwoLifterDelayStatTime;
                     return;
                 }
                 flag_status = enum_TwoDelayTim; 
                 return;

             }else if(key_status4 == 3)
             {
                 // 进入切换 2号传送带关闭延时时间
                 if(key_status5 == 4)
                 {// 进入确认设置 


                     if(key_status2 == 1)
                     {
                         // 加操作
                         key_status2 = 0;
                         send_flag = 6;
                         TwoConveyorData++;
                         time_key_flag = 0;
                     }

                     if(key_status3 == 1)
                     {
                         // 减操作
                         key_status3 = 0;
                         send_flag = 6;
                         TwoConveyorData--;
                         time_key_flag = 0;
                     }
                     //data = TwoConveyorData;
                     flag_status = enum_TwoConveyorCloseDelayTime;
                     return;
                 }
                 flag_status = enum_TwoCloseDelayTim; 
                 return;

             }else if(key_status4 == 4)
             {
                 // 进入切换 复位
                 if(key_status5 == 4)
                 {// 进行确认
                     key_status5 = 3;
                     send_flag = 1; // 确认发送默认值 Confirm_sendData_DefVal

                 }
                 //data = 3333;
                 flag_status = enum_InputSetDef; 
                 return;

             }else if(key_status4 == 5)
             {
                 // 进入切换 恢复出厂设置
                 if(key_status5 == 4)
                 {// 进行确认

                     send_flag = 2;
                     key_status5 = 3;

                 }
                 //data = 4444;
                 flag_status = enum_InputFactorySet;
                return;                 
             }

         }else if(key_status5 == 2)
         {
            key_status5 =4;
            key_status4 = 0;
         }
         flag_status = enum_SET_WAIT_Status; // 进入设置等待状态

     }else
     {
         // 显示实时数据
         flag_status = enum_REAL_TIMER_DATA;
     }
}

/* 
 * 实时显示
 *
 */
void realTime(void)
{

    if((change >= 0) && (change <= 1500))
    {
        data = (OneUART.Rx_buf[11] << 8) | OneUART.Rx_buf[12]; // 1号
        isOpenPoint = 0x08;
    }
    else if((change > 1500) && (change <= 3000))
    {
        data = (OneUART.Rx_buf[13] << 8) | OneUART.Rx_buf[14]; // 2号
        isOpenPoint = 0x04;
    }
}

Config_init.h

#ifndef __CONFIG_INIT_H
#define __CONFIG_INIT_H
#include "stm32f10x.h"

void Config_init();
#endif /* __CONFIG_INIT_H */

Config_init.c

#include "Config_init.h"

void Config_init()
{
    //USART1_Init(115200, OneUART.Tx_buf, OneUART.Rx_buf, USART1_REC_LEN);
    Nixie_Tube_GPIO_Config();  //Nixie_Tube_GPIO_Config();  
    KEY_GPIO_Config();  // 初始化按键的GPIO
}

stm32f10x_sdio.c (放下面这段代码为了重定向JATG)

int $Sub$$main(void)
{
     GPIO_InitTypeDef  GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);                            
    GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);                                
    GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);    
    Config_init();

  $Super$$main(); 

}

system_stm32f10x.c或者加上这段

GPIO_InitTypeDef  GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);                            

GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);                                
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);