串口的初始化包括gpio的初始化以及串口的初始化,串口1使用默认的IO,PA9/PA10。一般当IO作为外设输出的时候设置为复用推挽输出功能,输入的设置为浮空输入或者上下拉输入模式。- /*
- *串口1 配置函数
- *IO:PA9/PA10
- *blound: 波特率
- *数据位 8,停止位 1,无校验
- */
-
- void usart1_init(u32 bound)
- {
- gpio_init_type gpio_init_struct;
- /*Enable the UART Clock*/
- crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE); //开启GPIOA的时钟
- crm_periph_clock_enable(CRM_USART1_PERIPH_CLOCK, TRUE); //开启USART1的时钟
-
- gpio_default_para_init(&gpio_init_struct);
- /* Configure the UART1 TX pin */
- gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER; //较大电流推动/吸入能力
- gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL; //推挽输出
- gpio_init_struct.gpio_mode = GPIO_MODE_MUX; //复用
- gpio_init_struct.gpio_pins = GPIO_PINS_9; //PA9
- gpio_init_struct.gpio_pull = GPIO_PULL_NONE; //无上下拉
- gpio_init(GPIOA, &gpio_init_struct);
-
- /* Configure the UART1 RX pin */
- gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER; //较大电流推动/吸入能力
- gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL; //推挽输出
- gpio_init_struct.gpio_mode = GPIO_MODE_INPUT; //输入模式
- gpio_init_struct.gpio_pins = GPIO_PINS_10; //PA10
- gpio_init_struct.gpio_pull = GPIO_PULL_UP; //上拉
- gpio_init(GPIOA, &gpio_init_struct);
-
- nvic_irq_enable(USART1_IRQn, 0, 0); //使能串口1中断,优先级0,次优先级0
-
- /*Configure UART param*/
- usart_init(USART1, bound, USART_DATA_8BITS, USART_STOP_1_BIT); //波特率,8数据位,1停止位
- usart_hardware_flow_control_set(USART1,USART_HARDWARE_FLOW_NONE); //无硬件流操作
- usart_parity_selection_config(USART1,USART_PARITY_NONE); //无校验
- usart_transmitter_enable(USART1, TRUE); //使能发送
- usart_receiver_enable(USART1, TRUE); //使能接收
-
- usart_interrupt_enable(USART1, USART_RDBF_INT, TRUE); //使能串口接收中断
- usart_interrupt_enable(USART1, USART_IDLE_INT, TRUE); //使能串口空闲中断
- usart_enable(USART1, TRUE); //使能串口
-
- }
- 定义一个串口接收和发送数据结构体,便于扩展其他的串口实验。
- struct Muart {
- u8 Uartrxbuf[USART_REC_LEN]; //接收buf
- u8 Uarttxbuf[USART_REC_LEN]; //发送buf
- u8 Uartrxsta; //接收状态
- u16 Uartrxcut; //接收数据计数(长度)
- u16 Uarttxcut; //发送数据长度
- };
- // 中断服务函数
- void USART1_IRQHandler(void)
- {
- uint8_t clear;
- if(usart_flag_get(USART1, USART_RDBF_FLAG) != RESET) // USART1接收中断响应
- {
- Muartnum[0].Uartrxbuf[Muartnum[0].Uartrxcut++] =USART1->dt; // USART1读取数据寄存器
- }
-
- if(usart_flag_get(USART1, USART_IDLEF_FLAG) != RESET) // USART1总线空闲
- {
- clear=USART1->sts; // USART1清除空闲中断标志位
- clear=USART1->dt; // USART1清除空闲中断标志位
- clear&=0;
- Muartnum[0].Uartrxsta = 1; // USART1接收完成标志位
-
- }
-
- }
- // 轮询发送函数
- void usart1_txdatas(u8 *SendData,u16 len)
- {
- u16 i=0;
- for(i=0;i<len;i++)
- {
- while(usart_flag_get(USART1 , USART_TDBE_FLAG) == RESET); //发送寄存器空
- usart_data_transmit(USART1, SendData[i]); //发送数据
- while(usart_flag_get(USART1, USART_TDC_FLAG) == RESET); //发送完成
- }
-
- }
通过串口往板子发送数据,正常的话会收到相同的数据
|