STM32G0开发笔记:串口中断的使用

发布时间:
来源: 电子工程世界

使用Platformio平台的libopencm3开发框架来开发STM32G0,以下为串口中断的使用。


1 新建项目

建立uart项目

在PIO的Home页面新建项目,项目名称uart,选择开发板为上一次建立的自定义开发板型号 MonkeyPi_STM32_G070RB,开发框架选择libopencm3;



项目建立完成后在src目录下新建main.c主程序文件;

修改下载和调试方式,这里开发板使用的是DAPLink仿真器,因此修改platformio.ini文件如下:

1upload_protocol = cmsis-dap

2debug_tool = cmsis-dap

2 编写程序

时钟设置

1//system clock

2rcc_clock_setup(&rcc_clock_config[RCC_CLOCK_CONFIG_HSI_PLL_64MHZ]);

3

4//uart pin

5rcc_periph_clock_enable(RCC_USART1);

6rcc_periph_clock_enable(RCC_GPIOB);

先设置系统时钟为内部PLL生成64MHz,然后设置串口外设和串口引脚外设的时钟;


引脚复用功能设置

1gpio_mode_setup(GPIOB,GPIO_MODE_AF,GPIO_PUPD_NONE,GPIO6|GPIO7);

2gpio_set_af(GPIOB,GPIO_AF0,GPIO6|GPIO7);

根据芯片datasheet文档,使用USART1其引脚为PA9PA10,复用功能AF1为串口功能;


串口设置

1usart_set_baudrate(USART1,115200);

 2usart_set_databits(USART1,8);

 3usart_set_stopbits(USART1,USART_STOPBITS_1);

 4usart_set_parity(USART1,USART_PARITY_NONE);

 5usart_set_flow_control(USART1,USART_FLOWCONTROL_NONE);

 6usart_set_mode(USART1,USART_MODE_TX_RX);

 7

 8//uart isr

 9nvic_enable_irq(NVIC_USART1_IRQ);

10

11usart_enable(USART1);

12

13usart_enable_rx_interrupt(USART1);

先设置串口波特率、数据位数、停止位、校验、流控等设置,再开启串口中断,使能串口和其接收中断;


串口发送

1char buff[32] = "hello, makerinchina.cn ";

2for(int i=0; i){

3    usart_send_blocking(USART1, buff[i]);

4}

发送直接使用 usart_send_blocking 接口发送一个字节数据;


串口接收

1/**

 2 * @brief uart1 isr function

 3 * 

 4 */

 5void usart1_isr(void)

 6{

 7    //receive interrupt

 8    if (((USART_CR1(USART1) & USART_CR1_RXNEIE) != 0) &&

 9        ((USART_ISR(USART1) & USART_ISR_RXNE) != 0)) {

10

11        if(recv_index < BUFF_SIZE){

12            recv_buff[recv_index++] = usart_recv(USART1);

13        }else{

14            recv_index = 0;

15        }

16    }

17}

串口接收使用中断方式,接收到数据后将其存放的buff中,然后主程序中取出打印显示出来:


1#include 

 2#include 

 3#include 

 4#include 

 5

 6#include 

 7

 8volatile uint8_t recv_index = 0;

 9volatile uint8_t send_index = 0;

10

11#define BUFF_SIZE 64

12uint8_t recv_buff[BUFF_SIZE] = {0};

13

14int main(void)

15{

16    ...

17

18    while (1)

19    {

20

21        if(recv_index != send_index){ 

22

23            if(send_index < BUFF_SIZE){

24                usart_send_blocking(USART1, recv_buff[send_index++]);

25            }else{

26                send_index = 0;

27            }

28        }

29

30    }

31}

注:recv_index、send_index需要声明为volatile类型;


3 烧写测试

点击 platformio:Upload按钮或快捷键 Ctrl+Alt+U即可完成编译、烧写过程,打开串口工具,可以看到发送的数据和接收数据一样;


4 printf使用

如果要使用printf功能,需要定义如下函数,将串口重定向:


1/*

 2 * Called by libc stdio fwrite functions

 3 */

 4int

 5_write(int fd, char *ptr, int len)

 6{

 7    int i = 0;

 8

 9    /*

10     * Write "len" of char from "ptr" to file id "fd"

11     * Return number of char written.

12     *

13     * Only work for STDOUT, STDIN, and STDERR

14     */

15    if (fd > 2) {

16        return -1;

17    }

18    while (*ptr && (i < len)) {

19        usart_send_blocking(USART1, *ptr);

20        if (*ptr == ' ') {

21            usart_send_blocking(USART1, ' ');

22        }

23        i++;

24        ptr++;

25    }

26    return i;

27}

现在就可以直接使用printf函数进行打印显示到串口设备。


文章来源于: 电子工程世界 原文链接

本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。