OpenEdv-开源电子网

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

单线半双工模式下的USART的RXNE位没有变化?而且USART的数据寄存器始终不清零?

[复制链接]

13

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2015-6-8
在线时间
2 小时
发表于 2015-8-2 13:00:10 | 显示全部楼层 |阅读模式
5金钱
[mw_shl_code=c,true]#include "stm32f4xx.h" #include <stdio.h> #include "USART_guanfang.h" __IO u16 RxData=0; void delay(int i); int main(void) { USART_Config_t(); USART_SendData(USART1,97); USART_ReceiveData(USART1); while(1) { while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET); RxData = USART_ReceiveData(USART1); // printf("%c",RxData); delay(30000); USART_SendData(USART1,RxData); while(USART_GetFlagStatus(USART1,USART_FLAG_TC) == RESET); } } void delay(int i) { int j=3000; for(;i>0;i--) for(j=3000;j>0;j--); } int fputc(int ch, FILE *f) { /* Place your implementation of fputc here */ /* e.g. write a character to the USART */ USART_SendData(USART1, (uint8_t) ch); /* Loop until the end of transmission */ while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {} return ch; }[/mw_shl_code]


这个是main文件

[mw_shl_code=c,true]#include "USART_guanfang.h" void USART_Config_t(void) { USART_InitTypeDef USART_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; /* Peripheral Clock Enable -------------------------------------------------*/ /* Enable GPIO clock */ RCC_AHB1PeriphClockCmd(USARTx_TX_GPIO_CLK | USARTx_RX_GPIO_CLK, ENABLE); /* Enable USART clock */ RCC_APB2PeriphClockCmd(USARTx_CLK, ENABLE);//USARTx_CLK_INIT(USARTx_CLK, ENABLE); /* Enable the DMA clock */ RCC_AHB1PeriphClockCmd(USARTx_DMAx_CLK, ENABLE); /* USARTx GPIO configuration -----------------------------------------------*/ /* Connect USART pins to AF7 */ GPIO_PinAFConfig(USARTx_TX_GPIO_PORT, USARTx_TX_SOURCE, USARTx_TX_AF); GPIO_PinAFConfig(USARTx_RX_GPIO_PORT, USARTx_RX_SOURCE, USARTx_RX_AF); /* Configure USART Tx and Rx as alternate function push-pull */ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_InitStructure.GPIO_Pin = USARTx_TX_PIN; GPIO_Init(USARTx_TX_GPIO_PORT, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = USARTx_RX_PIN; GPIO_Init(USARTx_RX_GPIO_PORT, &GPIO_InitStructure); /* USARTx configuration ----------------------------------------------------*/ /* Enable the USART OverSampling by 8 */ USART_OverSampling8Cmd(USARTx_t, ENABLE); /* USARTx configured as follows: - BaudRate = 5250000 baud - Maximum BaudRate that can be achieved when using the Oversampling by 8 is: (USART APB Clock / 8) Example: - (USART3 APB1 Clock / 8) = (42 MHz / 8) = 5250000 baud - (USART1 APB2 Clock / 8) = (84 MHz / 8) = 10500000 baud - Maximum BaudRate that can be achieved when using the Oversampling by 16 is: (USART APB Clock / 16) Example: (USART3 APB1 Clock / 16) = (42 MHz / 16) = 2625000 baud Example: (USART1 APB2 Clock / 16) = (84 MHz / 16) = 5250000 baud - Word Length = 8 Bits - one Stop Bit - No parity - Hardware flow control disabled (RTS and CTS signals) - Receive and transmit enabled */ USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; /* When using Parity the word length must be configured to 9 bits */ USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USARTx_t, &USART_InitStructure); // /* Configure DMA controller to manage USART TX and RX DMA request ----------*/ // // /* Configure DMA Initialization Structure */ // DMA_InitStructure.DMA_BufferSize = BUFFERSIZE ; // DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable ; // DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull ; // DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single ; // DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; // DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; // DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; // DMA_InitStructure.DMA_PeripheralBaseAddr =(uint32_t) (&(USARTx->DR)) ; // DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; // DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; // DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; // DMA_InitStructure.DMA_Priority = DMA_Priority_High; // /* Configure TX DMA */ // DMA_InitStructure.DMA_Channel = USARTx_TX_DMA_CHANNEL ; // DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral ; // DMA_InitStructure.DMA_Memory0BaseAddr =(uint32_t)aTxBuffer ; // DMA_Init(USARTx_TX_DMA_STREAM,&DMA_InitStructure); // /* Configure RX DMA */ // DMA_InitStructure.DMA_Channel = USARTx_RX_DMA_CHANNEL ; // DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory ; // DMA_InitStructure.DMA_Memory0BaseAddr =(uint32_t)aRxBuffer ; // DMA_Init(USARTx_RX_DMA_STREAM,&DMA_InitStructure); danxian(); /* Enable USART */ USART_Cmd(USARTx_t, ENABLE); } void danxian(void)//采用单线半双工模式 { USARTx_t->CR3 |= (1<<3); USARTx_t->CR2 &= ~0x4800; USARTx_t->CR3 &= ~0x0022; }[/mw_shl_code]

这是我自己按照帮助文档改的

[mw_shl_code=c,true]#ifndef _USART_GUANFANG_H_ #define _USART_GUANFANG_H_ #include "stm32f4xx.h" #define USARTx_TX_GPIO_CLK RCC_AHB1Periph_GPIOA #define USARTx_RX_GPIO_CLK RCC_AHB1Periph_GPIOA #define USARTx_CLK RCC_APB2Periph_USART1 #define USARTx_DMAx_CLK RCC_AHB1Periph_DMA2 #define USARTx_TX_GPIO_PORT GPIOA #define USARTx_RX_GPIO_PORT GPIOA #define USARTx_TX_SOURCE GPIO_PinSource9 #define USARTx_RX_SOURCE GPIO_PinSource10 #define USARTx_TX_AF GPIO_AF_USART1 #define USARTx_RX_AF GPIO_AF_USART1 #define USARTx_TX_PIN GPIO_Pin_9 #define USARTx_RX_PIN GPIO_Pin_10 #define USARTx_t USART1 void USART_Config_t(void); void danxian(void); #endif[/mw_shl_code]

这是上一个文件的头文件

usart1,单线半双工。是这么写吗?

[mw_shl_code=c,true]void danxian(void)//采用单线半双工模式 { USARTx_t->CR3 |= (1<<3); USARTx_t->CR2 &= ~0x4800; USARTx_t->CR3 &= ~0x0022; }[/mw_shl_code]

我实验的时候确实好使,但是RXNE这个位没有变化。因此while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);这个语句从来就没有循环过,导致程序跑飞了。

问题1:难道单线半双工模式下RXNE永远不变,?

问题2:波特率只能选择115200,9600,2400,1200.。。。。。等这些特殊的数字吗?就不能设置成3000吗?

问题3:USART的数据寄存器始终不清零(在单线半双工模式下)?

最佳答案

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

1,不是。 2,可以。 3,看你代码。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2015-8-2 13:00:11 | 显示全部楼层
1,不是。
2,可以。
3,看你代码。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

13

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2015-6-8
在线时间
2 小时
 楼主| 发表于 2015-8-2 19:42:09 | 显示全部楼层
怒抢沙发,防尘补丁
回复

使用道具 举报

13

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2015-6-8
在线时间
2 小时
 楼主| 发表于 2015-8-5 14:44:33 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
波特率再4800的时候好使,当讲到2400的时候就开始乱码了,1200就更不用说了。115200到4800都好使为什么低频的时候反而不好使了?
回复

使用道具 举报

3

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2017-9-25
在线时间
15 小时
发表于 2018-3-19 13:04:50 | 显示全部楼层
yzl 发表于 2015-8-5 14:44
回复【3楼】正点原子:
---------------------------------
波特率再4800的时候好使,当讲到2400的时候就开 ...

在一个时钟下 有最低波特率和最高波特率限制的
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-20 19:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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