14421|3

51

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

【Nucleo心得】stm32l053开发板串口程序,使用printf函数 [复制链接]

最近在研究这块板子,发现官方例程里面的usart十分不好用,自己将程序修改为f1系列常用的形式供大家交流,有错误的地方还望提出!
1.rcc时钟配置请见https://bbs.eeworld.com.cn/thread-447853-1-1.html
2.usart设置,由于板载VCP,而且已经和usart2的RX、TX连接好,即PA2、PA3,那就不必使用usart1了(还有外接一个usb转串口模块)
主要设置异步方式、波特率、数据长度等常见参数,步骤如图所示,其他部分默认就好


2.gpio配置和usart2中断配置


3.printf函数重映射
#if 1
#pragma import(__use_no_semihosting)            
//标准库需要的支持函数                 
struct __FILE
{
        int handle;

};

FILE __stdout;      
//定义_sys_exit()以避免使用半主机模式   
void _sys_exit(int x)
{
        x = x;
}

//重定义fputc函数
int fputc(int ch, FILE *f)
{      
        while((USART2->ISR&0X40)==0);//循环发送,直到发送完毕   
    USART2->TDR = (uint8_t) ch;      
        return ch;
}
#endif

由于使用printf函数请将stdio.h包含进来
4.使能接收中断
在初始化usart2函数中加入        __HAL_UART_ENABLE_IT(&huart2,UART_IT_RXNE);使能接收中断
5.中断服务函数书写(参考原子例程修改,详细内容请参考《STM32不完全手册-库函数版本_V3.0》)
void USART2_IRQHandler(void)                        //串口1中断服务程序
        {
               
        uint8_t Res;
     HAL_UART_IRQHandler(&huart2);
    if(__HAL_UART_GET_IT(&huart2, UART_IT_RXNE) != RESET)  //
    {
          USART2->RQR |= 0x08;//?? RXNE
          Res =USART2->RDR;//USARTx_RX_Data(&UartHandle);
        if((USART_RX_STA&0x8000)==0)//
       {
               if(USART_RX_STA&0x4000)//
             {
                     if(Res!=0x0a)USART_RX_STA=0;//
                    else USART_RX_STA|=0x8000;        //
             }
           else //?????0X0D
           {
                 if(Res==0x0d)USART_RX_STA|=0x4000;
                 else
                {
                       USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
                      USART_RX_STA++;
                      if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//         
               }         
          }
       }  

  }
                HAL_NVIC_ClearPendingIRQ(USART2_IRQn);       
}       


由于我的中断函数直接写在了usart.c文件中,需要将stm32l0xx_it.c文件中的同名函数注释掉。
定义了一些变量详细内容请参考附件
6.主函数的任务
判断用户是否从串口输入内容,如果输入就将输入的内容再次从串口发送出去,否则一直发送默认内容
if(USART_RX_STA&0x8000)
                {                                          
                        len=USART_RX_STA&0x3f;//得到此次接收到的数据长度
                        printf("\r\n您发送的消息为:\r\n\r\n");
                        for(t=0;t                         {
                                //printf("",USART_RX_BUF[t]);
                                USART2->TDR = (uint8_t)USART_RX_BUF[t];//向串口2发送数据
                                while((USART2->ISR&0X40)==0);//等待发送结束
                        }
                        printf("\r\n\r\n");//插入换行
                        USART_RX_STA=0;
                }
                else
                {
                times++;
                        if(times%1000==0)
                        {
                                printf("\r\nSTM32L053 Nucleo开发板串口实验\r\n");
                        }
                        if(times%200==0)printf("请输入数据,以回车键结束\n");       
                        HAL_Delay(2);               
                }

附件的例程使用了外部的HSE晶振,如果没有焊好HSE晶振请不要直接使用本例程,将历程中的RCC配置好后再使用。
USART2.zip (1.61 MB, 下载次数: 539)

此帖出自stm32/stm8论坛

最新回复

请问楼主一定要用你用的那个串口软件吗,那个软件叫什么名字   详情 回复 发表于 2016-4-3 22:36
点赞 关注(1)
 

回复
举报

2

帖子

1

TA的资源

一粒金砂(初级)

沙发
 
楼主您好,我刚用这块开发板,我用的USART1,在PA9,PA10上接了线到u转串口线,用官网例程改了一下,试了一下发数据,串口助手始终接收不到数据,不知道什么原因。。
此帖出自stm32/stm8论坛
 
 

回复

918

帖子

0

TA的资源

纯净的硅(中级)

板凳
 
TX和RX顺序对不对啊?把 GND 也接上。
此帖出自stm32/stm8论坛
 
 

回复

6

帖子

0

TA的资源

一粒金砂(初级)

4
 
请问楼主一定要用你用的那个串口软件吗,那个软件叫什么名字
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表