历史上的今天
返回首页

历史上的今天

今天是:2024年12月05日(星期四)

正在发生

2019年12月05日 | 【AT91SAM3S】串口UART初始化及收发数据

2019-12-05 来源:elecfans

SAM3S中的UART串口是一个两线异步收发器。这个串口能用来通信或者跟踪。有两个DMA通道与UART串口关联,可通过使用DMA处理串口传输以节省CPU时间。


SAM3S4C中有两个UART。与外设引脚的对应关系如下:

image

板子上使用的是UART0,及PA9和PA10引脚。

SAM3S的UART结构框图

image

串口初始化,收发数据 的步骤如下:

1、配置相应IO口的引脚(设置IO时钟及引脚工作模式)

2、打开UART时钟

3、复位并停止UART

4、设置UART功能(奇偶校验UART_MR、波特率UART_BRGR、DMA UART_PTCR、收发使能UART_CR 等)

5、收发数据 UART_THR  UART_RHR

串口的初始化程序如下:

//引脚宏定义,串口0收发引脚分别对因PA9 PA10

#define PINS_UART { PIO_PA9A_URXD0|PIO_PA10A_UTXD0, PIOA, ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT}

#define CONSOLE_PINS {PINS_UART}

//使用的串口的宏定义,使用UART0

#define CONSOLE_USART UART0

extern void UART_Configure( uint32_t baudrate, uint32_t masterClock)
{
    const Pin pPins[] = CONSOLE_PINS;
    Uart *pUart = CONSOLE_USART;

    /* Configure PIO */
    PIO_Configure(pPins, PIO_LISTSIZE(pPins));  //配置对应引脚

    /* Configure PMC */
    PMC->PMC_PCER0 = 1 << CONSOLE_ID;  //打开UART时钟

    /* Reset and disable receiver & transmitter */
    pUart->UART_CR = UART_CR_RSTRX | UART_CR_RSTTX
                   | UART_CR_RXDIS | UART_CR_TXDIS;  //复位并停止UART

    /* Configure mode */
    pUart->UART_MR =  UART_MR_PAR_NO;  //设置奇偶校验(不校验)

    /* Configure baudrate */
    /* Asynchronous, no oversampling */
    pUart->UART_BRGR = (masterClock / baudrate) / 16;  //设置波特率

    /* Disable PDC channel */
    pUart->UART_PTCR = UART_PTCR_RXTDIS | UART_PTCR_TXTDIS;  //接收和发送都不使用DMA

    /* Enable receiver and transmitter */
    pUart->UART_CR = UART_CR_RXEN | UART_CR_TXEN;  //使能传输

    _ucIsConsoleInitialized=1 ;   //置位初始化状态
}

串口发送一个字符:

extern void UART_PutChar( uint8_t c )

{

Uart *pUart=CONSOLE_USART ;

if ( !_ucIsConsoleInitialized )//每次发送数据都先判断一下串口是否已经被初始化了

{

UART_Configure(CONSOLE_BAUDRATE, BOARD_MCK);

}

/* Wait for the transmitter to be ready */

while ( (pUart->UART_SR & UART_SR_TXEMPTY) == 0 ) ;//等待串口状态寄存器中,发送寄存器为空的标志

/* Send character */

pUart->UART_THR=c ; //发送状态为空时,即可将字符丢到发送寄存器中。

}

串口接收一个字符:

extern uint32_t UART_GetChar( void )

{

Uart *pUart=CONSOLE_USART ;

if ( !_ucIsConsoleInitialized ) //每次接收数据都要判断下串口是否被初始化了

{

UART_Configure(CONSOLE_BAUDRATE, BOARD_MCK);

}

while ( (pUart->UART_SR & UART_SR_RXRDY) == 0 ) ; //等待串口状态寄存器中的RXRDY置位,这个为表示串口完整地接收了一个数据

return pUart->UART_RHR ; //读取接收到的数据并返回。同时硬件自动复位RXRDY位。

}

 

之后就可以使用了,我在主函数中只用了一句来验证串口的状态:

UART_PutChar(UART_GetChar());

即,将电脑端来的数据发回去。验证下,完全正常了。


当然,这里使用的是查询方式接收数据。至于中断方式接收数据,在学会了使用中断之后会补上来的。

推荐阅读

史海拾趣

Advanced Power Solutions公司的发展小趣事

Advanced Power Solutions公司自创立之初,就致力于电源管理技术的研发。在一次偶然的实验中,公司的研发团队发现了一种新的电源转换技术,可以显著提高能源利用效率。公司迅速投入资源,完善这项技术,并成功将其应用于新产品中。这款高效能的产品迅速在市场上获得了认可,为公司带来了可观的收益,也奠定了公司在电源管理领域的领先地位。

CDE [ CORNELL DUBILIER ELECTRONICS ]公司的发展小趣事

经过近百年的发展,CDE公司始终坚守品质至上的原则,为全球客户提供高品质的电容器产品。公司通过不断的技术研发和产品升级,逐步在全球市场上树立了良好的口碑。如今,CDE的电容器产品已广泛应用于电源、电机、驱动器、航空电子、电力和军用电子设备等多个领域,赢得了全球客户的信赖。

CUI Inc.公司的发展小趣事

在追求持续增长的道路上,CUI Inc.采取了一项重要举措——收购加拿大电源制造商Tectrol Inc.。这次收购为CUI带来了丰富的产品线和技术资源,尤其是Tectrol在标准和定制电源解决方案方面的领先设计能力和制造能力。通过整合Tectrol的技术和资源,CUI进一步巩固了其在电源设计领域的领先地位,并为其未来的发展奠定了坚实的基础。

Baneasa SA公司的发展小趣事

面对日益增长的市场需求,Baneasa SA意识到必须提升产能以满足客户的需求。于是,公司投入大量资金对生产线进行升级改造,引进了先进的生产设备和技术。这些举措使得Baneasa SA的产能得到了大幅提升,同时也保证了产品质量的稳定性和可靠性。

Advanced Components Industries Inc公司的发展小趣事

在国内市场取得一定成绩后,ACI开始寻求国际合作,以进一步拓宽市场。公司与国际知名电子企业建立了战略合作关系,共同研发新产品,开拓新市场。这些合作不仅提升了ACI的技术水平,还为其带来了更多的国际订单。

通过国际合作,ACI的产品逐渐进入国际市场,公司的影响力不断扩大。同时,ACI也积极参与国际电子行业的交流活动,与同行分享经验,学习先进技术,不断提升自身实力。

BURGESS公司的发展小趣事

BURGESS一直以其专业的服务和优质的管理而著称。它非常重视客户的需求和体验,为每一个拥有超级游艇的客户提供量身定制的服务方案。无论是游艇的销售、采购、租赁还是技术顾问和经营管理,BURGESS都能提供全面而专业的服务。这种对细节的关注和对质量的追求,使得BURGESS赢得了众多高端客户的信任和青睐,连美国总统特朗普的超级游艇都是由BURGESS负责管理的。

尽管无法提供BURGESS在电子行业的发展故事,但以上关于其在游艇经纪行业的几个重要发展事实,充分展示了BURGESS的卓越实力和专业水平。如需更多关于BURGESS的信息,建议查阅其官方网站或相关新闻报道。

问答坊 | AI 解惑

初学嵌入式开发ARM的学习方法(转载)

这个题目很大,给人一种感觉我好像很成功,其实不然。实际上自己水平不高,甚至很低,但是做过了一些曲折的学习道路,同时把自己真实的学习历程表达出来,希望对后来者有借鉴的意义,甚幸!     工作三年、几成废人!      我2000年毕业 ...…

查看全部问答>

TFT彩图显示法 详细资料

这是一份 TFT彩图显示法 很详细资料 足够可以让你玩弄手机液晶屏…

查看全部问答>

推荐几款可用在2410的gprs模块

要求提供的动态链接库、源代码可以在evc上执行, 就是说它可以支持arm的嵌入式系统,arm的操作系统wince。 价钱、型号,最好有网站介绍。 …

查看全部问答>

要学习51,是买学习板还是自己焊比较好呢?

要学习51,是买学习板还是自己焊比较好呢?自己焊是在万用板上焊的吧?…

查看全部问答>

Wince 5.0 上编写的程序如何打包?用C#写的?

有两个,一个是Program Files 文件夹,一个是应用程序文件夹。 分别代表什么什么意思,可以可以给我讲一下…

查看全部问答>

求助:关于pxa270实现4级灰度控制的驱动程序

我们使用PXA270平台,wince 5.0操作系统。客户提供了一片单色LCD,4bit输入,每1个bit代表1个点,每个点都有ON/OFF两种状态。分辨率640*480。LCD中内置了一颗Max5484来控制灰度。客户要求我们做到4bpp,16级灰度。 但是Max5484这个芯片只能调整整 ...…

查看全部问答>

浏览器的思想

各位高手:     我最近要写一个浏览器(c语言,gtk ,linux),有没有写过的阿,给个提示呀 …

查看全部问答>

帮忙啊

有哪位好心人把windows live id号码借我用一下啊,我要下载个wdk,最近注册了好几次都没有成功,是不是不开放注册了?…

查看全部问答>

Verilog 里的参数 是不是不能综合到硬件电路上而只能仿真中用啊?

Verilog 里的参数 是不是不能综合到硬件电路上而只能仿真中用啊比如图中的 parameter clkdivider = 25000000/440/2;在下载到芯片里后 就有个寄存器里存了  clkdivider = 25000000/440/2这个值?求高手指导 [ 本帖最后由 wzyuliyang 于 2 ...…

查看全部问答>