[应用相关] 基于V2库串口1 RDBF中断接收数据功能

[复制链接]
589|0
 楼主| Henryko 发表于 2023-2-28 11:00 | 显示全部楼层 |阅读模式
        串口的初始化包括gpio的初始化以及串口的初始化,串口1使用默认的IO,PA9/PA10。一般当IO作为外设输出的时候设置为复用推挽输出功能,输入的设置为浮空输入或者上下拉输入模式。
  1. /*
  2. *串口1  配置函数
  3. *IO:PA9/PA10
  4. *blound: 波特率
  5. *数据位 8,停止位 1,无校验
  6. */

  7. void usart1_init(u32 bound)
  8. {
  9.         gpio_init_type gpio_init_struct;
  10.         /*Enable the UART Clock*/
  11.         crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);                //开启GPIOA的时钟
  12.         crm_periph_clock_enable(CRM_USART1_PERIPH_CLOCK, TRUE);                //开启USART1的时钟
  13.           
  14.     gpio_default_para_init(&gpio_init_struct);
  15.         /* Configure the UART1 TX pin */
  16.         gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;        //较大电流推动/吸入能力
  17.     gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;                                //推挽输出
  18.     gpio_init_struct.gpio_mode = GPIO_MODE_MUX;                                                                //复用
  19.     gpio_init_struct.gpio_pins = GPIO_PINS_9;                                                                //PA9
  20.     gpio_init_struct.gpio_pull = GPIO_PULL_NONE;                                                        //无上下拉
  21.     gpio_init(GPIOA, &gpio_init_struct);

  22.         /* Configure the UART1 RX pin */
  23.     gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;        //较大电流推动/吸入能力
  24.     gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;                                //推挽输出
  25.     gpio_init_struct.gpio_mode = GPIO_MODE_INPUT;                                                        //输入模式
  26.     gpio_init_struct.gpio_pins = GPIO_PINS_10;                                                                //PA10
  27.     gpio_init_struct.gpio_pull = GPIO_PULL_UP;                                                                //上拉
  28.     gpio_init(GPIOA, &gpio_init_struct);
  29.        
  30.         nvic_irq_enable(USART1_IRQn, 0, 0);                                                      //使能串口1中断,优先级0,次优先级0
  31.        
  32.         /*Configure UART param*/
  33.     usart_init(USART1, bound, USART_DATA_8BITS, USART_STOP_1_BIT);                //波特率,8数据位,1停止位
  34.     usart_hardware_flow_control_set(USART1,USART_HARDWARE_FLOW_NONE);        //无硬件流操作
  35.     usart_parity_selection_config(USART1,USART_PARITY_NONE);                        //无校验
  36.     usart_transmitter_enable(USART1, TRUE);                                                                //使能发送
  37.     usart_receiver_enable(USART1, TRUE);                                                                //使能接收
  38.        
  39.         usart_interrupt_enable(USART1, USART_RDBF_INT, TRUE);                                //使能串口接收中断
  40.         usart_interrupt_enable(USART1, USART_IDLE_INT, TRUE);                                //使能串口空闲中断
  41.     usart_enable(USART1, TRUE);                                                                                        //使能串口
  42.        
  43. }
  1. 定义一个串口接收和发送数据结构体,便于扩展其他的串口实验。
  2.         struct Muart {
  3.         u8 Uartrxbuf[USART_REC_LEN];        //接收buf
  4.         u8 Uarttxbuf[USART_REC_LEN];        //发送buf
  5.         u8 Uartrxsta;                                        //接收状态
  6.         u16 Uartrxcut;                                        //接收数据计数(长度)
  7.         u16 Uarttxcut;                                        //发送数据长度
  8. };
  1. // 中断服务函数
  2. void USART1_IRQHandler(void)
  3. {       
  4.         uint8_t clear;
  5.         if(usart_flag_get(USART1, USART_RDBF_FLAG) != RESET)              // USART1接收中断响应
  6.         {
  7.                 Muartnum[0].Uartrxbuf[Muartnum[0].Uartrxcut++] =USART1->dt;          // USART1读取数据寄存器               
  8.         }

  9.         if(usart_flag_get(USART1, USART_IDLEF_FLAG) != RESET)               // USART1总线空闲
  10.         {
  11.                 clear=USART1->sts;                                              // USART1清除空闲中断标志位
  12.                 clear=USART1->dt;                                                                                                // USART1清除空闲中断标志位
  13.                 clear&=0;
  14.                 Muartnum[0].Uartrxsta = 1;                                                                                // USART1接收完成标志位

  15.         }
  16.                
  17. }
  1. // 轮询发送函数
  2. void usart1_txdatas(u8 *SendData,u16 len)
  3. {
  4.         u16 i=0;
  5.         for(i=0;i<len;i++)
  6.         {
  7.                 while(usart_flag_get(USART1 , USART_TDBE_FLAG) == RESET);        //发送寄存器空
  8.                 usart_data_transmit(USART1, SendData[i]);                                        //发送数据
  9.                 while(usart_flag_get(USART1, USART_TDC_FLAG) == RESET);                //发送完成
  10.         }
  11.        
  12. }
通过串口往板子发送数据,正常的话会收到相同的数据
您需要登录后才可以回帖 登录 | 注册

本版积分规则

138

主题

2411

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部