OpenEdv-开源电子网

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

UART4发数据的小问题,麻烦大家帮我看看。

[复制链接]

8

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2014-5-16
在线时间
8 小时
发表于 2014-5-16 11:30:16 | 显示全部楼层 |阅读模式
5金钱
我是初学者,麻烦大家帮我看看这段UART4的初始化代码不能工作啊,谢谢了!

void uart4_init(u32 bound)
{
       //GPIO端口设置
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    
    RCC_APB2PeriphClockCmd(RCC_APB1Periph_UART4|RCC_APB2Periph_GPIOC, ENABLE);    //使能UART4,GPIOC时钟
    
    //UART4_TX   PC.10
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PC.10
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOC, &GPIO_InitStructure);

  USART_DeInit(UART4);
 
    //USART初始化设置
    USART_InitStructure.USART_BaudRate = bound;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Tx ;

  USART_Init(UART4, &USART_InitStructure);
  USART_Cmd(UART4, ENABLE);

}

但是使用下面这个代码是可以工作的。

void uart4_init(u32 pclk2,u32 bound)
{
    float temp;
 u16 mantissa;
 u16 fraction;   
 temp=(float)(pclk2*1000000)/(bound*16);//??USARTDIV
 mantissa=temp;
 fraction=(temp-mantissa)*16;
    mantissa<<=4;
 mantissa+=fraction;
 RCC->APB2ENR|=1<<4;  
 RCC->APB1ENR|=1<<19;
 GPIOC->CRH&=0XFFFF00FF;
 GPIOC->CRH|=0X00008B00;

 RCC->APB1RSTR|=1<<19;
 RCC->APB1RSTR&=~(1<<19);   
  UART4->BRR=mantissa;
 UART4->CR1|=0X200C;
#ifdef EN_UART4_RX 
 UART4->CR1|=1<<8;
 UART4->CR1|=1<<5;   
 MY_NVIC_Init(3,3,UART4_IRQChannel,2);
#endif
}

请大家帮我看看这两段代码是哪里不同,谢谢了。

最佳答案

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

RCC_APB1Periph_UART4看看这个时钟是在什么总线上的???????
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-5-16 11:30:17 | 显示全部楼层
RCC_APB1Periph_UART4看看这个时钟是在什么总线上的???????
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

8

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2014-5-16
在线时间
8 小时
 楼主| 发表于 2014-5-16 12:54:49 | 显示全部楼层
回复【2楼】Badu_Space:
---------------------------------
粗心了,谢谢楼上!
回复

使用道具 举报

8

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2014-3-19
在线时间
14 小时
发表于 2014-5-17 16:05:03 | 显示全部楼层
可以吗?我看你好像对PC11做处理
回复

使用道具 举报

8

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2014-5-16
在线时间
8 小时
 楼主| 发表于 2014-5-18 14:05:33 | 显示全部楼层
回复【4楼】libolibixuan:
---------------------------------
可以了。
回复

使用道具 举报

3

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2014-11-7
在线时间
2 小时
发表于 2015-5-8 13:54:25 | 显示全部楼层
#define RCC_APB1Periph_UART4             ((uint32_t)0x00080000),这个不是说明UART4时钟在总线APB1上吗
回复

使用道具 举报

3

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2014-11-7
在线时间
2 小时
发表于 2015-5-8 14:11:02 | 显示全部楼层
2楼,你改了哪里可以了,指点下,我的UART4还不能用
回复

使用道具 举报

3

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2014-11-7
在线时间
2 小时
发表于 2015-5-8 14:13:15 | 显示全部楼层
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //使能GPIOC时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE);  //使能UART4时钟
//Configure USART4 Tx (PC.10) as alternate function pushpull
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;  //PC.10
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //GPIO电路工作速率50Mhz
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化PC10
   
//Configure UART4 Rx (PC.11) as input floating
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //PC.11
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
GPIO_Init(GPIOC, &GPIO_InitStructure);   //初始化PC11
//<<<<<<<<<<<<<<<USART结构体成员赋值>>>>>>>>>>>>>>>>>>>
USART_InitStruct.USART_BaudRate = baund; //设置波特率
USART_InitStruct.USART_WordLength = USART_WordLength_8b; //数据位8位
USART_InitStruct.USART_StopBits = USART_StopBits_1; //停止位1位
USART_InitStruct.USART_Parity = USART_Parity_No ; //无奇偶校验位
USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //双线全双工通讯
USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;   //硬件流控制(使用RTS、CTS功能)

USART_Init(UART4, &USART_InitStruct); //初始化USART
USART_Cmd(UART4, ENABLE); //使能USART外设
if(RxIt != 0)
{
USART_ITConfig(UART4, USART_IT_RXNE, ENABLE);  //接收中断使能
}
else
{
USART_ITConfig(UART4, USART_IT_RXNE, DISABLE);  //接收中断使能
}

哪里有问题????????????
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-22 18:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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