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

发布时间:2023-06-28  

使用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函数进行打印显示到串口设备。


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

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>