高级会员

- 积分
- 660
- 金钱
- 660
- 注册时间
- 2013-11-22
- 在线时间
- 131 小时
|

楼主 |
发表于 2014-3-18 16:21:40
|
显示全部楼层
回复【11楼】正点原子:
---------------------------------
原子哥,我这两天调试遇到邪门的事了,我将RS485收发控制端PC9改为PG9来控制,程序仅有几处改动,只是将原来的PC9改为PG9来控制,其它就都好了(其中蓝色为之前的部分,红色为改动之后的部分)
我原来的配置代码为:
#define EN485_UART4 PCout(9) // 串口4收发模式控制引脚为PG9
#define UART4_TXMode EN485_UART4=1//串口4置为发送模式
#define UART4_RXMode EN485_UART4=0 //串口4置为接收模式
void uart4_init(u32 pclk1,u32 bound)
{
float temp;
u16 mantissa;
u16 fraction;
temp=(float)(pclk1*1000000)/(bound*16);//得到USARTDIV
mantissa=temp; //得到整数部分
fraction=(temp-mantissa)*16; //得到小数部分
mantissa<<=4;
mantissa+=fraction;
RCC->APB2ENR|=1<<4; //使能PORTC口时钟 ,收发引脚PC10,PC11需要使用 ,收发控制PC9需要使用
RCC->APB1ENR|=1<<19; //使能串口4时钟
GPIOC->CRH&=0XFFFF000F;//IO状态设置,PC11做浮空输入模式,PC10复用输出,PC9通用推挽输出模式
GPIOC->CRH|=0X00008B30;//IO状态设置
RCC->APB1RSTR|=1<<19; //复位串口4
RCC->APB1RSTR&=~(1<<19);//停止复位
//波特率设置
UART4->BRR=mantissa; // 波特率设置
UART4->CR1|=0X200C; //1位停止,无校验位.
//使能接收中断
UART4->CR1|=1<<8; //PE中断使能
UART4->CR1|=1<<5; //接收缓冲区非空中断使能
MY_NVIC_Init(2,0,UART4_IRQChannel,2);//抢占优先级2,响应优先级0,组2
//串口4结构体变量初始化
Uart4.m_ReceiveBytes=0;
Uart4.m_SendBytes=0;
Uart4.g_RecTimeOutFlag=0;
Uart4.ComInterruptFlag=0;
Uart4.g_TimeCounter=0;
Uart4.p_RecBuff=(u8 *)Uart4.RecBuff;
Uart4.p_SendBuff=(u8 *)Uart4.SendBuff;
//初始化控制485处于接收模式
UART4_RXMode;
}
改为这样程序就正常了,也不卡死了:
#define EN485_UART4 PGout(9) // 串口4收发模式控制引脚为PG9
#define UART4_TXMode EN485_UART4=1//串口4置为发送模式
#define UART4_RXMode EN485_UART4=0 //串口4置为接收模式
void uart4_init(u32 pclk1,u32 bound)
{
float temp;
u16 mantissa;
u16 fraction;
temp=(float)(pclk1*1000000)/(bound*16);//得到USARTDIV
mantissa=temp; //得到整数部分
fraction=(temp-mantissa)*16; //得到小数部分
mantissa<<=4;
mantissa+=fraction;
RCC->APB2ENR|=1<<4; //使能PORTC口时钟 ,收发引脚PC10,PC11需要使用
RCC->APB2ENR|=1<<8; //使能PORTG口时钟 ,收发控制PG9需要使用
RCC->APB1ENR|=1<<19; //使能串口4时钟
GPIOC->CRH&=0XFFFF00FF;//IO状态设置,PC11做浮空输入模式,PC10复用输出
GPIOC->CRH|=0X00008B00;//IO状态设置
GPIOG->CRH&=0XFFFFFF0F;//IO状态设置,PG9复用输出
GPIOG->CRH|=0X00000030;//IO状态设置
RCC->APB1RSTR|=1<<19; //复位串口4
RCC->APB1RSTR&=~(1<<19);//停止复位
//波特率设置
UART4->BRR=mantissa; // 波特率设置
UART4->CR1|=0X200C; //1位停止,无校验位.
//使能接收中断
UART4->CR1|=1<<8; //PE中断使能
UART4->CR1|=1<<5; //接收缓冲区非空中断使能
MY_NVIC_Init(2,0,UART4_IRQChannel,2);//抢占优先级2,响应优先级0,组2
//串口4结构体变量初始化
Uart4.m_ReceiveBytes=0;
Uart4.m_SendBytes=0;
Uart4.g_RecTimeOutFlag=0;
Uart4.ComInterruptFlag=0;
Uart4.g_TimeCounter=0;
Uart4.p_RecBuff=(u8 *)Uart4.RecBuff;
Uart4.p_SendBuff=(u8 *)Uart4.SendBuff;
//初始化控制485处于接收模式
UART4_RXMode;
}
我这里PC9和PG9都当做普通IO口输出脚,来控制RS485的收发,将PC9的配置改为PG9的配置,整个程序就不一样了,太奇怪了啊!
(注:PC9和PG9都没有作为它用) |
|