[MCU]

6ull 串口发送数据 在检测发送完成卡死

[复制链接]
400|10
手机看帖
扫描二维码
随时随地手机跟帖
一路向北lm|  楼主 | 2020-8-4 18:02 | 显示全部楼层 |阅读模式
568015f29321643e92.png

#include "bsp_uart.h"

/************************************
* void Uart1Init(void)
* 初始化6ULL的串口1
* UART1_Tx -> GPIO1_IO6
* UART1_Rx -> GPIO1_IO7
************************************/
void Uart1Init(void)
{
   //1.初始化串口1对应的IO
   SW_MUX_UART1_TX = 0;       //设置GPIO1_6为UART1_Tx
   SW_MUX_UART1_RX = 0;       //设置GPIO1_7为UART1_Rx

   SW_PAD_UART1_TX =  0X10B0; //配置UART1_Tx IO属性
   SW_PAD_UART1_RX =  0X10B0; //配置UART1_Rx IO属性

   GPIO1_GDIR |= (1 <<6);     //配置UART1_Tx IO为输出
   GPIO1_GDIR &= ~(1 <<7);    //配置UART1_Rx IO为输入

   //2.初始化UART1
   UART1_UCR1 &= ~(1<<0);          //关闭串口1
   UART1_UCR1 = 0;                 //清除UART1_UCR1
   UART1_UCR2 = 0;                 //清除UART1_UCR2
   UART1_UCR3 = 0;                 //清除UART1_UCR3
   UART1_UCR2 &= ~(1<<0);          //软复位串口1
   while((UART1_UCR2 & 0x1)== 0);  //等待复位完成
   UART1_UCR1 &= ~(1<<14);         //关闭自动波特率检测
   UART1_UCR2 |= (1<<5);           //数据位为8位
   UART1_UCR2 &= ~(1<<8);          //无效验位
   UART1_UCR2 &= ~(1<<6);          //1个停止位
   UART1_UCR2 |= (1<<14);          //忽略RST引脚
   UART1_UCR2 |= (1<<2);           //使能发送
   UART1_UCR2 |= (1<<1);           //使能接收
   UART1_UCR3 |= (1<<2);           //UCR3的bit2必须为1

   //3.设置UART1波特率
   // 波特率计算公式:Baud Rate = Ref Freq / (16 * (UBMR + 1)/(UBIR+1))
   // 如果要设置波特率为 115200,那么可以使用如下参数:
   // Ref Freq = 80M 也就是寄存器 UFCR 的 bit9:7=101, 表示 1 分频
   // UBMR = 3124
   // UBIR = 71
   UART1_UFCR |= (5<<7);   //ref freq 等于 ipg_clk/1=80Mhz
   UART1_UBIR = 71;
   UART1_UBMR = 3124;

   UART1_UCR1 |= (1<<0);          //打开串口1
}

/************************************
* void UART1_SendByte(unsigned char byte)
* 串口1 发送一个字节数据
************************************/
void UART1_SendByte(unsigned char byte)
{
    UART1_UTXD = (byte & 0xFF);              //发送数据
    while(((UART1_UCR2 >>3) & 0x01) == 0);   //等待发送完成
}

/************************************
* void UART1_SendStr(unsigned char *str)
* 串口1 发送字符串数据
************************************/
void UART1_SendStr(unsigned char *str)
{
   while(*str== '\0')
   {
      UART1_SendByte(*str++);
   }
}

/************************************
* unsigned char UART1_RecvByte(void)
* 串口1 接收一个字节数据
************************************/
unsigned char UART1_RecvByte(void)
{
    while((UART1_USR2 & 0x1) == 0);   // 等待接收完成
    return UART1_URXD;                // 返回接收到的数据
}


使用特权

评论回复

相关帖子

ayb_ice| | 2020-8-5 13:35 | 显示全部楼层
while(*str== '\0')???

使用特权

评论回复
一路向北lm|  楼主 | 2020-8-6 10:03 | 显示全部楼层
ayb_ice 发表于 2020-8-5 13:35
while(*str== '\0')???

我改了,本来while(*str!= '\0') ,卡死了,才改的,UART1_SendByte就卡死,注释 while(((UART1_UCR2 >>3) & 0x01) == 0)就ok

使用特权

评论回复
ayb_ice| | 2020-8-6 10:40 | 显示全部楼层
一路向北lm 发表于 2020-8-6 10:03
我改了,本来while(*str!= '\0') ,卡死了,才改的,UART1_SendByte就卡死,注释 while(((UART1_UCR2 >> ...

这个寄存器用对了吗?
另外不要用中断

使用特权

评论回复
ayb_ice| | 2020-8-6 10:46 | 显示全部楼层
一路向北lm 发表于 2020-8-6 10:03
我改了,本来while(*str!= '\0') ,卡死了,才改的,UART1_SendByte就卡死,注释 while(((UART1_UCR2 >> ...

一般情况下等于0 应该是发送完成了吧


所以应该是  while(((UART1_UCR2 >>3) & 0x01) != 0);

使用特权

评论回复
一路向北lm|  楼主 | 2020-8-6 15:42 | 显示全部楼层
ayb_ice 发表于 2020-8-6 10:40
这个寄存器用对了吗?
另外不要用中断

不用中断

使用特权

评论回复
一路向北lm|  楼主 | 2020-8-6 15:43 | 显示全部楼层
ayb_ice 发表于 2020-8-6 10:46
一般情况下等于0 应该是发送完成了吧

为1  表示发送完成

使用特权

评论回复
一路向北lm|  楼主 | 2020-8-6 16:25 | 显示全部楼层
ayb_ice 发表于 2020-8-6 10:46
一般情况下等于0 应该是发送完成了吧

不好意思,读错寄存器了,应该是UART1_USR2  谢谢啦

使用特权

评论回复
一路向北lm|  楼主 | 2020-8-6 16:25 | 显示全部楼层
ayb_ice 发表于 2020-8-6 10:46
一般情况下等于0 应该是发送完成了吧

不好意思,读错寄存器了,应该是UART1_USR2  谢谢啦

使用特权

评论回复
m564522634| | 2020-8-7 16:34 | 显示全部楼层
一路向北lm 发表于 2020-8-6 16:25
不好意思,读错寄存器了,应该是UART1_USR2  谢谢啦

最近在移植littleVG的gui 显示,完成了一起玩下

使用特权

评论回复
一路向北lm|  楼主 | 2020-8-8 14:54 | 显示全部楼层
m564522634 发表于 2020-8-7 16:34
最近在移植littleVG的gui 显示,完成了一起玩下

可以的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

256

主题

3639

帖子

72

粉丝