OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5048|回复: 2

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

[复制链接]

3

主题

8

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2020-5-5
在线时间
7 小时
发表于 2020-8-4 18:00:53 | 显示全部楼层 |阅读模式
1金钱
捕获.PNG

具体代码如下:
  1. #include "bsp_uart.h"

  2. /************************************
  3. * void Uart1Init(void)
  4. * 初始化6ULL的串口1
  5. * UART1_Tx -> GPIO1_IO6
  6. * UART1_Rx -> GPIO1_IO7
  7. ************************************/
  8. void Uart1Init(void)
  9. {
  10.    //1.初始化串口1对应的IO
  11.    SW_MUX_UART1_TX = 0;       //设置GPIO1_6为UART1_Tx
  12.    SW_MUX_UART1_RX = 0;       //设置GPIO1_7为UART1_Rx

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

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

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

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

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

  43. /************************************
  44. * void UART1_SendByte(unsigned char byte)
  45. * 串口1 发送一个字节数据
  46. ************************************/
  47. void UART1_SendByte(unsigned char byte)
  48. {
  49.     UART1_UTXD = (byte & 0xFF);              //发送数据
  50.     while(((UART1_UCR2 >>3) & 0x01) == 0);   //等待发送完成
  51. }

  52. /************************************
  53. * void UART1_SendStr(unsigned char *str)
  54. * 串口1 发送字符串数据
  55. ************************************/
  56. void UART1_SendStr(unsigned char *str)
  57. {
  58.    while(*str== '\0')
  59.    {
  60.       UART1_SendByte(*str++);
  61.    }
  62. }

  63. /************************************
  64. * unsigned char UART1_RecvByte(void)
  65. * 串口1 接收一个字节数据
  66. ************************************/
  67. unsigned char UART1_RecvByte(void)
  68. {
  69.     while((UART1_USR2 & 0x1) == 0);   // 等待接收完成
  70.     return UART1_URXD;                // 返回接收到的数据
  71. }
复制代码


最佳答案

查看完整内容[请看2#楼]

结贴了 读错了寄存器了,应该是读状态寄存器UART1_USR2,却读成了UART1_UCR2,希望大家不要犯和我一样的错误。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

8

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2020-5-5
在线时间
7 小时
 楼主| 发表于 2020-8-4 18:00:54 | 显示全部楼层
结贴了   读错了寄存器了,应该是读状态寄存器UART1_USR2,却读成了UART1_UCR2,希望大家不要犯和我一样的错误。
回复

使用道具 举报

3

主题

8

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2020-5-5
在线时间
7 小时
 楼主| 发表于 2020-8-6 10:05:55 | 显示全部楼层
我改了,本来while(*str!= '\0') ,卡死了,才改的,UART1_SendByte就卡死,注释 while(((UART1_UCR2 >>3) & 0x01) == 0)就ok
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-24 07:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表