查看: 2884|回复: 2

[原创] 【KL27 mini Board 开发】+ LUART(寄存器)

[复制链接]
  • TA的每日心情
    奋斗
    2025-5-7 09:07
  • 签到天数: 353 天

    连续签到: 1 天

    [LV.8]以坛为家I

    141

    主题

    8056

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    5785
    最后登录
    2025-5-7
    发表于 2016-4-4 21:57:14 | 显示全部楼层 |阅读模式
    本帖最后由 wambob 于 2016-4-5 14:26 编辑

           UART在很多场合使用。因为要和透传蓝牙模块连接,特地使用寄存器体验硬件底层,问题来了在while里使用查询接收时延时长了就会出错。查询出错可能跟速度有关吧,只好使用中断接收。另外使用printf命令还要添加代码,摘自例程。学习就是折腾的过程。
    1. #include "main.h"
    2. void LPUART1_WriteByte( char ch);
    3. uint8_t LPUART1_ReadByte( uint8_t *ch);
    4. void LPUART1_init(void);
    5. void myDelay (uint32_t ulTime)
    6. {
    7.     uint32_t i;

    8.     i = 0;
    9.     while (ulTime--) {
    10.         for (i = 0; i < 5000; i++);
    11.     }
    12. }
    13. uint8_t ch;
    14. int main()
    15. {
    16. //     SystemCoreClockUpdate();
    17.     SIM_SCGC5 |= (SIM_SCGC5_PORTA_MASK            
    18.                   | SIM_SCGC5_PORTB_MASK
    19.                   | SIM_SCGC5_PORTC_MASK
    20.                   | SIM_SCGC5_PORTD_MASK
    21.                   | SIM_SCGC5_PORTE_MASK );
    22. LPUART1_init();
    23.     printf("123456789asdsafdgtyu\r\n");
    24.    
    25.     PORTC_PCR3|= 0x00000100u;
    26.     PORTA_PCR1|= 0x00000100u;        //设置 PTC3 复用为 GPIO 模式
    27.     PORTE_PCR0|= 0x00000100u;           //设置 PTA1、2,PTE0复用为 GPIO 模式
    28.     PORTA_PCR2|= 0x00000100u;
    29.    
    30.     GPIOC_PSOR |= 1U<< 3;                //初始化输出状态为1
    31.     GPIOA_PSOR |= 1U<< 1;
    32.     GPIOE_PSOR |= 1U;
    33.     GPIOA_PSOR |= 1U<< 2;
    34.    
    35.     GPIOC_PDDR |= 1U<<3;                //设置为输出
    36.     GPIOA_PDDR |= 1U<<1;               
    37.     GPIOE_PDDR |= 1U;
    38.     GPIOA_PDDR |= 1U<<2;
    39.    
    40.     while(1)
    41.      {               
    42.       GPIOC_PTOR =1U<< 3;
    43.        myDelay(200);
    44.        GPIOA_PTOR =1U<< 1;
    45.        myDelay(200);
    46.        GPIOE_PTOR =1U;
    47.         myDelay(200);
    48.        GPIOA_PTOR =1U<< 2;
    49.        myDelay(200);
    50.          
    51. //       while( LPUART1_ReadByte( &ch))  ;         
    52.   //     printf("%c", ch);

    53.     }   

    54. }
    55. void LPUART1_init(void)
    56. {
    57.     SIM_SOPT2|=SIM_SOPT2_LPUART1SRC(1);          //选择LPUART1工作时钟
    58.     SIM_SCGC5|=SIM_SCGC5_LPUART1(1);             //打开LPUART1时钟门
    59.    
    60.     PORTA_PCR18|= PORT_PCR_ISF(1)|PORT_PCR_MUX(0x3);
    61.     PORTA_PCR19|= PORT_PCR_ISF(1)|PORT_PCR_MUX(0x3); //复用为3清楚引脚中断
    62.    
    63.     LPUART1_CTRL&=~LPUART_CTRL_RE(1)|LPUART_CTRL_TE(1); //关闭收发功能
    64.    
    65.     LPUART1_BAUD &= ~LPUART_BAUD_SBR_MASK;
    66.     LPUART1_BAUD &= ~LPUART_BAUD_OSR_MASK;
    67.     LPUART1_BAUD |= LPUART_BAUD_SBR(26) | LPUART_BAUD_OSR(15);  //波特率115200
    68.    
    69.     LPUART1_CTRL &= ~LPUART_CTRL_PE_MASK;                     //无奇偶校验
    70.     LPUART1_CTRL &= ~LPUART_CTRL_M_MASK;                      //8bit
    71.    
    72.     LPUART1_CTRL|=LPUART_CTRL_RE(1)|LPUART_CTRL_TE(1);       //开启收发功能

    73. }

    74. void LPUART1_WriteByte(char ch)
    75. {
    76.     while(!(LPUART1_STAT & LPUART_STAT_TDRE_MASK));
    77.     LPUART1_DATA = (ch );
    78. }

    79. uint8_t LPUART1_ReadByte( uint8_t *ch)
    80. {   
    81.    if(LPUART1_STAT & LPUART_STAT_RDRF_MASK)
    82.     {
    83.         *ch = (uint8_t)(LPUART1_DATA);        
    84.         return 0;                  
    85.     }
    86.     return 1;
    87. }

    88. #ifdef __CC_ARM // MDK Support
    89. struct __FILE
    90. {
    91.         int handle;
    92.         /* Whatever you require here. If the only file you are using is */
    93.         /* standard output using printf() for debugging, no file handling */
    94.         /* is required. */
    95. };
    96. /* FILE is typedef’ d in stdio.h. */
    97. FILE __stdout;
    98. FILE __stdin;
    99. __weak int fputc(int ch,FILE *f)
    100. {
    101.         LPUART1_WriteByte( ch);
    102.         return ch;
    103. }
    复制代码
    中断接收在LPUART1_init开启接收中断,添加代码
    1. LPUART1_CTRL|=LPUART_CTRL_RE(1)|LPUART_CTRL_TE(1)|LPUART_CTRL_RIE(1);       //开启收发功能,接收中断
    2.    
    3.     NVIC_EnableIRQ(LPUART1_IRQn);
    4.     NVIC_SetPriority(LPUART1_IRQn,3);
    复制代码
    添加中断服务接口
    1. void  LPUART1_IRQHandler (void)
    2. {  
    3.   
    4.   LPUART1_ReadByte(&ch);
    5.   printf("%c", ch);  
    6.    
    7.    
    8. }
    复制代码

    未命名.JPG


    评分

    参与人数 1NXP金币 +20 收起 理由
    小七 + 20 赞一个!

    查看全部评分

    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2019-10-17 08:07
  • 签到天数: 273 天

    连续签到: 1 天

    [LV.8]以坛为家I

    74

    主题

    2338

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    7508
    最后登录
    2021-8-30
    发表于 2016-4-6 08:08:31 | 显示全部楼层
    谢谢分享
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2017-1-24 09:50
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    654

    主题

    3262

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    13127
    最后登录
    2019-1-27
    发表于 2016-4-6 15:30:30 | 显示全部楼层
    给力  赞一个
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-20 23:21 , Processed in 0.097181 second(s), 23 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表