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

关于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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版