at91sam7x256之串口uart0设置之二

本文详细记录了在配置AT91SAM7X256的串口UART0时遇到的波特率设置和数据发送异常问题。通过检查晶振频率和修改寄存器设置,最终成功解决了串口通信中的数据错乱问题。文章还提供了相关代码示例,包括UART0的初始化和中断处理函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

搞了两天,at91sam7x256之串口uart0终于搞定了,

一开始出现的问题是发送出来的数据不对,但是用串口调试助手给开发板发送数据,然后直接回送没有问题。

原因是串口波特率设置不对,我把晶振频率FOSC作为系统主时钟MCK用了,虽然检查半天控制寄存器US_CR和模式寄存器US_MR各个位的值设置都没有问题,也是不行的。

看了开发板例程中的board .h头文件,我才知道原来晶振频率FOSC作为系统主时钟MCK不同:

#define AT91B_MAIN_OSC        18432000               // Main Oscillator MAINCK
#define AT91B_MCK             ((18432000*73/14)/2)   // Output PLL Clock

波特率问题就这样搞定了,可是还是有问题:

发送0x55,串口调试助手收到0xaa
发送0xbb,串口调试助手受到0xdd
这个问题也是灵机一动,这么有规律的错误,肯定是那个寄存器设置有点问题,

原来我把US_MR中US_MSBF设置了【高位在前地位在后】的发送,去掉这个US_MSBF设置使用默认的【低位在前高位在后】就可以了。

又解决一个问题,下功夫,就有收获啊。

代码都好了,贴出来以后还能用。

//UART0.H文件内容


extern AT91S_AIC * pAIC;
 void SendChar(unsigned char CH);
 void Init_UART0();

//UART0.C文件内容

#include <AT91SAM7X256.H>
#include "UART0.H"
#define  Fosc 18432000
#define AT91B_MAIN_OSC        18432000               // Main Oscillator MAINCK
#define AT91B_MCK             ((18432000*73/14)/2)   // Output PLL Clock
AT91PS_PIO    GPIO_A=AT91C_BASE_PIOA;
AT91PS_USART  UART0 =AT91C_BASE_US0;
//----------------------------------------
AT91S_AIC * pAIC=AT91C_BASE_AIC;
unsigned char DacContralBuff[16];
//----------------------------------------
void SendChar(unsigned char CH)
{
   while(!(UART0->US_CSR&0X02));
     UART0->US_THR=CH;
}
//----------------------------------------
unsigned char GetChar()
{
 unsigned char ch;

 return ch;
}
//-----------------------------------------
__irq void Usart0ISR(void)
{
 *AT91C_AIC_ICCR|=(1 << AT91C_ID_US0);
 if(UART0->US_CSR&0X01)
 {
  DacContralBuff[0]=UART0->US_RHR&0xff;
  SendChar(DacContralBuff[0]);
 }
 *AT91C_AIC_EOICR = 0X00; 
}
//=================
__inline unsigned int AT91F_US_Baudrate (
 const unsigned int main_clock, // /arg peripheral clock
 const unsigned int baud_rate)  // /arg UART baudrate
{
 unsigned int baud_value = ((main_clock*10)/(baud_rate * 16));
 if ((baud_value % 10) >= 5)
  baud_value = (baud_value / 10) + 1;
 else
  baud_val

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值