使用Platformio平台的libopencm3开发框架来开发STM32G0,以下为串口中断的使用。
1 新建项目
在PIO的Home页面新建项目,项目名称uart,选择开发板为上一次建立的自定义开发板型号 MonkeyPi_STM32_G070RB,开发框架选择libopencm3;
项目建立完成后在src目录下新建main.c主程序文件;
修改下载和调试方式,这里开发板使用的是DAPLink仿真器,因此修改platformio.ini文件如下:
1 2 upload_protocol = cmsis-dap debug_tool = cmsis-dap
2 编写程序
1 2 3 4 5 6 rcc_clock_setup(&rcc_clock_config[RCC_CLOCK_CONFIG_HSI_PLL_64MHZ]); rcc_periph_clock_enable(RCC_USART1); rcc_periph_clock_enable(RCC_GPIOB);
先设置系统时钟为内部PLL生成64MHz,然后设置串口外设和串口引脚外设的时钟;
1 2 gpio_mode_setup(GPIOB,GPIO_MODE_AF,GPIO_PUPD_NONE,GPIO6|GPIO7); gpio_set_af(GPIOB,GPIO_AF0,GPIO6|GPIO7);
根据芯片datasheet文档,使用USART1其引脚为PA9\PA10,复用功能AF1为串口功能;
1 2 3 4 5 6 7 8 9 10 11 12 13 usart_set_baudrate(USART1,115200 ); usart_set_databits(USART1,8 ); usart_set_stopbits(USART1,USART_STOPBITS_1); usart_set_parity(USART1,USART_PARITY_NONE); usart_set_flow_control(USART1,USART_FLOWCONTROL_NONE); usart_set_mode(USART1,USART_MODE_TX_RX); nvic_enable_irq(NVIC_USART1_IRQ); usart_enable(USART1); usart_enable_rx_interrupt(USART1);
先设置串口波特率、数据位数、停止位、校验、流控等设置,再开启串口中断,使能串口和其接收中断;
1 2 3 4 char buff[32 ] = "hello, makerinchina.cn\n" ;for (int i=0 ; i<strlen (buff); i++){ usart_send_blocking(USART1, buff[i]); }
发送直接使用 usart_send_blocking
接口发送一个字节数据;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 void usart1_isr (void ) { if (((USART_CR1(USART1) & USART_CR1_RXNEIE) != 0 ) && ((USART_ISR(USART1) & USART_ISR_RXNE) != 0 )) { if (recv_index < BUFF_SIZE){ recv_buff[recv_index++] = usart_recv(USART1); }else { recv_index = 0 ; } } }
串口接收使用中断方式,接收到数据后将其存放的buff中,然后主程序中取出打印显示出来:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 #include <libopencm3/stm32/usart.h> #include <libopencm3/stm32/rcc.h> #include <libopencm3/stm32/gpio.h> #include <libopencm3/cm3/nvic.h> #include <string.h> volatile uint8_t recv_index = 0 ;volatile uint8_t send_index = 0 ;#define BUFF_SIZE 64 uint8_t recv_buff[BUFF_SIZE] = {0 };int main (void ) { ... while (1 ) { if (recv_index != send_index){ if (send_index < BUFF_SIZE){ usart_send_blocking(USART1, recv_buff[send_index++]); }else { send_index = 0 ; } } } }
注:recv_index、send_index需要声明为volatile类型;
3 烧写测试 点击 platformio:Upload按钮或快捷键 Ctrl+Alt+U即可完成编译、烧写过程,打开串口工具,可以看到发送的数据和接收数据一样;
4 printf使用 如果要使用printf功能,需要定义如下函数,将串口重定向:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 int _write(int fd, char *ptr, int len) { int i = 0 ; if (fd > 2 ) { return -1 ; } while (*ptr && (i < len)) { usart_send_blocking(USART1, *ptr); if (*ptr == '\n' ) { usart_send_blocking(USART1, '\r' ); } i++; ptr++; } return i; }
现在就可以直接使用printf函数进行打印显示到串口设备;