手上的板子将485接在了USART1上。我尝试修改代码但是始终无法正确通信。debug都进不了USART1_IRQHandler方法。在站里也搜索了好久始终没能解决问题。求大佬解救。
具体情况:
STM32F103VBT6
485芯片SP3082EE,管脚RX接PA10,TX接PA9,中间两个接PA8。
下面是485init 方法[mw_shl_code=c,true]void RS485_Init(u32 bound)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能GPIOA时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能USART1时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //PD8端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA9
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
GPIO_Init(GPIOA, &GPIO_InitStructure);
RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1,ENABLE);//复位串口1
RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1,DISABLE);//停止复位
#ifdef EN_USART1_RX //如果使能了接收
USART_InitStructure.USART_BaudRate = bound;//波特率设置
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(USART1, &USART_InitStructure); ; //初始化串口
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //使能串口2中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; //先占优先级2级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级2级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断
USART_Cmd(USART1, ENABLE); //使能串口
#endif
RS485_TX_EN=0; //默认为接收模式
}
[/mw_shl_code]
USART1_IRQHandler 方法写在同一文件中
[mw_shl_code=c,true]void USART1_IRQHandler(void)
{
u8 res;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收到数据
{
res =USART_ReceiveData(USART1); //读取接收到的数据
if(RS485_RX_CNT<64)
{
RS485_RX_BUF[RS485_RX_CNT]=res; //记录接收到的值
RS485_RX_CNT++; //接收数据增加1
}
}
} [/mw_shl_code]
NVIC_PriorityGroupConfig 写在main方法中
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
目前情况:
代码从485的例子来的,在开发板上可以跑通,换了芯片信息后重新编译的。修改了485中的代码。
由于例子代码中usart.x中使用了USART1,所以我先把usart.x给删了,然后发现程序都没办法debug,具体表现是debug后无法进入main方法,查询后发现好像和其中的printf,半主机模式相关。
然后就把usart.x部分的代码保留,将原来使用到USART1的部分都替换成了USART2。可以正常debug了,但是USART1_IRQHandler都不会走。
使用usart1做485通信的时候需要注意哪些东西?usart1用于485通信了,那原来usart.x中的相关代码怎么修改?
自学STM32一段时间了,好不容易将实例搞完,可以用开发板做出自己想要的效果了,想着换个板子试试。没想到问题好多,自学这玩意真的难。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
哎搞不定,搞出来麻烦给我参考参考。。谢谢啦
板子,接法应该是没问题的。因为我这里有现成的hex,是可以让485成功的。但是没有源码。
而且是固定的板子,也不太好修改。
那个不是时钟,只是复位过程
一周热门 更多>