新手入门
- 积分
- 7
- 金钱
- 7
- 注册时间
- 2016-11-19
- 在线时间
- 1 小时
|
5金钱
用STM32 USART3做485,485能正常发送,同时传感器也返回了数据,用的USART3,PB11上也有数据信号。先发送数据,然后485控制位置低,然后接收。写了两种接收方式,一种非中断的,读不到数据一直卡在file:///C:\Users\s206zen\Documents\Tencent Files\494095096\Image\C2C\C5@U)(I9CF4@ZDPH_~FPXM4.pngwhile(USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == RESET) 这句。
然后改成中断接收,进不了中断。
但是接收引脚上确实有信号。用的外接了,485HUB,电脑连HUB也能收到传感器返回的数据,就是STM32接收不到。贴上源码

void RS485Init(void) //中断接收初始化
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //485_TX
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //485_RX
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
GPIO_Init(GPIOB, &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = 9600;
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_Mode_Rx;
USART_Init(USART3, &USART_InitStructure);
USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);
USART_ITConfig(USART3,USART_IT_TXE,DISABLE);
USART_Cmd(USART3, ENABLE);
USART_GetITStatus(USART3, USART_FLAG_TC);
}
static void USART3_NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* Configure the NVIC Preemption Priority Bits */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
/* USART3 中断优先级*/
NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
int main()
{
RS485Init();
USART3_NVIC_Configuration();
RS485_SET_TX_Mode();
if(mode==1)//X模式
{
char adress=0x01;
char func=0x03;
char RH=0x00;
char RL=0x00;
char RLH=0x00;
char RLL=0x02;
char CRC16L=0xc4;
char CRC16H=0x0B;
printf("%c%c%c%c%c%c%c%c\n",adress,func,RH,RL,RLH,RLL,CRC16L,CRC16H);
delay(10000000);
RS485_SET_RX_Mode();
}
}
void USART3_IRQHandler(void)
{
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
{
RcvCh = (char)USART3->DR & 0xFF;
a=RcvCh;
i++;
}
RS485_SET_TX_Mode();
}

void RS485Init(void) //不用中断接收,初始化
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //485_TX
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //485_RX
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
GPIO_Init(GPIOB, &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = 9600;
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_Mode_Rx;
USART_Init(USART3, &USART_InitStructure);
USART_Cmd(USART3, ENABLE);
USART_GetITStatus(USART3, USART_FLAG_TC);
}
int main(void)
{
RS485Init();
RS485_SET_TX_Mode();
while(1)
{
if(mode==0)//RX模式
{
while(1)
{
while(USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == RESET)
{
}
RcvCh = (char)USART3->DR & 0xFF;
a=RcvCh;
i++;
if(i==8)
{
i=0;
RS485_SET_TX_Mode();
break;
}
}
}
if(mode==1)//TX模式
{
char adress=0x01;
char func=0x03;
char RH=0x00;
char RL=0x00;
char RLH=0x00;
char RLL=0x02;
char CRC16L=0xc4;
char CRC16H=0x0B;
printf("%c%c%c%c%c%c%c%c\n",adress,func,RH,RL,RLH,RLL,CRC16L,CRC16H);
delay(1000);
RS485_SET_TX_Mode();
}
delay(10000000);
}
}
|
-
|