你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

关于stm32 设置1M波特率问题

[复制链接]
destinyhb 提问时间:2018-10-10 14:14 /
使用的是STM32F103VCT6,现需要将波特率设置为1M,但是设置了1M波特率后数据无法发送正确。使用的是UART4

UART串口设置:

void uart4_init(u32 bound){

        //GPIO端口设置
       GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);        //使能USART1,GPIOA时钟
       
        USART_DeInit(UART4);  //复位串口1
       
        //uart4 TX   PC.10
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //复用推挽输出
        GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化

        //uart4 RX          PC.11
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
        GPIO_Init(GPIOC, &GPIO_InitStructure);  //

       //USART 初始化设置
        USART_InitStructure.USART_BaudRate = bound;//一般设置为9600;
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
        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_Rx | USART_Mode_Tx;        //收发模式
       
        USART_Init(UART4, &USART_InitStructure); //初始化串口
        //NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn;
        NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=configLIBRARY_KERNEL_INTERRUPT_PRIORITY ;//抢占优先级3
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;                //子优先级3
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ通道使能
        NVIC_Init(&NVIC_InitStructure);        //根据指定的参数初始化VIC寄存器

        USART_ITConfig(UART4, USART_IT_RXNE, ENABLE);//开启中断

        USART_Cmd(UART4, ENABLE);                    //使能串口

}


接收到的数据是错误的:
void UART4_IRQHandler(void)
{
#if 1

        static portBASE_TYPE xHigherPriorityTaskWoken;
        if(USART_GetITStatus(UART4, USART_IT_RXNE) != RESET)  
        {
                USART_ClearITPendingBit(UART4,USART_IT_RXNE);
                uart4revi = USART_ReceiveData(UART4);
                uart4recvdata[uart4recvlen++] = uart4revi;

                xSemaphoreGiveFromISR(ReciveCodeuart4,&xHigherPriorityTaskWoken);
        }

        if( xHigherPriorityTaskWoken != pdFALSE )
        {
                portEND_SWITCHING_ISR( xHigherPriorityTaskWoken );
        }
#endif
}


并且主循环的循环发送无法发送了
收藏 评论4 发布时间:2018-10-10 14:14

举报

4个回答
wenyangzeng 回答时间:2018-10-10 17:04:23
波特率1M不是标准通讯规格,用到256000已经是USART通讯的极限了。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

STM1024 回答时间:2018-10-11 09:13:09
你的时钟频率是多少呢?72MHz?
s2333 回答时间:2018-10-11 10:43:44
uart4如果时钟是36M,波特率上限是36/16=2.25M,
具体算法精度等可以看看http://www.cnblogs.com/shangdawei/p/4641805.html

确定时钟没问题后,那么你用1M波特率的话,这个接出来的线估计不能太长,一般来说电路板上走线问题应该不大

然后,你接到的地方是不是波特率也是1M,不对等的话数据肯定不正常。

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

s2333 回答时间:2018-10-11 10:50:58
刚刚帖子好像被吞了  - - 重发一下

先确定UART4时钟是多少,如果是36M,那么上限是36/16=2.25M
具体算法和精度可以看看http://www.cnblogs.com/shangdawei/p/4641805.html

用1M波特率的话,连线不能太长,按理来说板子走线问题应该不大

你这个连接的东西波特率是不是也调整到1M了,不对等的话是数据是会不正常的

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版