1.7.8.S5PV210串行通信编程实战2

1.7.8.1、串口Tx、Rx对应的GPIO的初始化
给GPA0CON的相应bit位赋值为相应值,用C语言位操作来完成。
1.7.8.2、UCON、ULCON、UMCON、UFCON等主要控制寄存器
依据上节中分析的值进行依次设置即可。
1.7.8.3、波特率的计算和设置
(1)第一步,用PCLK_PSYS和目标波特率去计算DIV_VAL: DIV_VAL = (PCLK / (bps x 16)) ?1
(2)第二步,UBRDIV0寄存器中写入DIV_VAL的整数部分
(3)第三步,用小数部分*16得到1个个数,查表得uBDIVSLOT0寄存器的设置值
1.7.8.4、串口发送和接收函数的编写
(1)写发送函数,主要发送前要用while循环等待发送缓冲区为空才能发送。
1.7.8.5、综合调试
注意Makefile的修改。
1.7.8.6、扩展练习-更改波特率后再调试

自己练习。注意程序中改了波特率后,SecureCRT也要相应修改,不然收不到东西。


[cpp]  view plain  copy
  1. #define GPA0CON     0xE0200000  
  2. #define UCON0       0xE2900004  
  3. #define ULCON0      0xE2900000  
  4. #define UMCON0      0xE290000C  
  5. #define UFCON0      0xE2900008  
  6. #define UBRDIV0     0xE2900028  
  7. #define UDIVSLOT0   0xE290002C  
  8. #define UTRSTAT0    0xE2900010  
  9. #define UTXH0       0xE2900020    
  10. #define URXH0       0xE2900024    
  11.   
  12. #define rGPA0CON    (*(volatile unsigned int *)GPA0CON)  
  13. #define rUCON0      (*(volatile unsigned int *)UCON0)  
  14. #define rULCON0     (*(volatile unsigned int *)ULCON0)  
  15. #define rUMCON0     (*(volatile unsigned int *)UMCON0)  
  16. #define rUFCON0     (*(volatile unsigned int *)UFCON0)  
  17. #define rUBRDIV0    (*(volatile unsigned int *)UBRDIV0)  
  18. #define rUDIVSLOT0  (*(volatile unsigned int *)UDIVSLOT0)  
  19. #define rUTRSTAT0   (*(volatile unsigned int *)UTRSTAT0)  
  20. #define rUTXH0      (*(volatile unsigned int *)UTXH0)  
  21. #define rURXH0      (*(volatile unsigned int *)URXH0)  
  22.   
  23. // 串口初始化程序  
  24. void uart_init(void)  
  25. {  
  26.     // 初始化Tx Rx对应的GPIO引脚  
  27.     rGPA0CON &= ~(0xff<<0);           // 把寄存器的bit0~7全部清零  
  28.     rGPA0CON |= 0x00000022;         // 0b0010, Rx Tx  
  29.       
  30.     // 几个关键寄存器的设置  
  31.     rULCON0 = 0x3;  
  32.     rUCON0 = 0x5;  
  33.     rUMCON0 = 0;  
  34.     rUFCON0 = 0;  
  35.       
  36.     // 波特率设置    DIV_VAL = (PCLK / (bps x 16))-1  
  37.     // PCLK_PSYS用66MHz算     余数0.8  
  38.     //rUBRDIV0 = 34;      
  39.     //rUDIVSLOT0 = 0xdfdd;  
  40.       
  41.     // PCLK_PSYS用66.7MHz算       余数0.18  
  42.     // DIV_VAL = (66700000/(115200*16)-1) = 35.18  
  43.     rUBRDIV0 = 35;  
  44.     // (rUDIVSLOT中的1的个数)/16=上一步计算的余数=0.18  
  45.     // (rUDIVSLOT中的1的个数 = 16*0.18= 2.88 = 3  
  46.     rUDIVSLOT0 = 0x0888;        // 3个1,查官方推荐表得到这个数字  
  47. }  
  48.   
  49.   
  50. // 串口发送程序,发送一个字节  
  51. void uart_putc(char c)  
  52. {                     
  53.     // 串口发送一个字符,其实就是把一个字节丢到发送缓冲区中去  
  54.     // 因为串口控制器发送1个字节的速度远远低于CPU的速度,所以CPU发送1个字节前必须  
  55.     // 确认串口控制器当前缓冲区是空的(意思就是串口已经发完了上一个字节)  
  56.     // 如果缓冲区非空则位为0,此时应该循环,直到位为1  
  57.     while (!(rUTRSTAT0 & (1<<1)));  
  58.     rUTXH0 = c;  
  59. }  
  60.   
  61. // 串口接收程序,轮询方式,接收一个字节  
  62. char uart_getc(void)  
  63. {  
  64.     while (!(rUTRSTAT0 & (1<<0)));  
  65.     return (rURXH0 & 0x0f);  
  66. }  


数据手册中的资料,

The receiver detects(检测) overrun(溢出) error, parity error, frame error and break condition, each of which sets an error flag.


Frame error indicates that the received data does not have a valid(有效的) stop bit. 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值