at91sam7x256之串口uart0设置之二

搞了两天,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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值