查看: 4146|回复: 8

[分享] 【LPC800项目】代码分享:串口初始化.

[复制链接]
  • TA的每日心情
    开心
    2023-6-2 13:32
  • 签到天数: 272 天

    连续签到: 1 天

    [LV.8]以坛为家I

    44

    主题

    995

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    4413
    最后登录
    2023-6-2
    发表于 2016-12-2 12:30:47 | 显示全部楼层 |阅读模式
    本帖最后由 andrewz 于 2016-12-2 12:34 编辑

    调好了时钟,对于这块已经无法用swd进行调试的"半残"板子,立马做的事情就是调串口.

    下面是代码,部分代码涉及更多应用方面的内容,就删除了.只保留最底层的部分.
    1. #define _UART_GLOBAL_
    2. #include "./bsp/peripheral/uart.h"
    3. #include "./bsp/chip/LPC8xx.h"
    4. #include "./bsp/peripheral/swm.h"

    5. #define SYSCON_SYSAHBCLKCTRL_UART0      ((unsigned long)1<<14)

    6. #define SYSCON_PRESETCTRL_UARTFRG_RST_N ((unsigned long)1<<2)
    7. #define SYSCON_PRESETCTRL_UART0_RST_N   ((unsigned long)1<<3)


    8. #define USART_CFG_ENABLE                ((unsigned long)1<<0)
    9. #define USART_CFG_DATALEN_MASK          ((unsigned long)0x0000000C)
    10. #define USART_CFG_DATALEN_SHIFT         ((unsigned long)2)

    11. #define USART_INTENSET_RXRDYEN          ((unsigned long)1<<0)
    12. #define USART_INTENSET_TXRDYEN          ((unsigned long)1<<2)
    13. #define USART_INTENCLR_TXRDYCLR         ((unsigned long)1<<2)

    14. #define USART_STAT_RXRDY                ((unsigned long)1<<0)
    15. #define USART_STAT_TXRDY                ((unsigned long)1<<2)
    16.    

    17. void enable_tx_int(void);
    18. void disable_tx_int(void);

    19. unsigned char temp_o;
    20. unsigned char temp_i;

    21. void UART0_IRQHandler(void){
    22.     if(LPC_USART0->STAT&USART_STAT_RXRDY){
    23.         temp_i=LPC_USART0->RXDAT;
    24.     }

    25.     if(LPC_USART0->STAT&USART_STAT_TXRDY){
    26.         LPC_USART0->TXDAT=temp_o;
    27.     }
    28. }

    29. void enable_tx_int(void){
    30.     LPC_USART0->INTENSET|=USART_INTENSET_TXRDYEN;
    31. }

    32. void disable_tx_int(void){
    33.     LPC_USART0->INTENCLR|=USART_INTENCLR_TXRDYCLR;
    34. }



    35. void u_putc(unsigned char c){
    36.     while((LPC_USART0->STAT&USART_STAT_TXRDY)==0);
    37.     LPC_USART0->TXDAT=c;
    38. }


    39. void Uart_init(void){
    40.     LPC_SYSCON->SYSAHBCLKCTRL|=SYSCON_SYSAHBCLKCTRL_UART0;
    41.    
    42.     LPC_SYSCON->PRESETCTRL&=~(SYSCON_PRESETCTRL_UART0_RST_N|SYSCON_PRESETCTRL_UARTFRG_RST_N);
    43.     LPC_SYSCON->PRESETCTRL|=SYSCON_PRESETCTRL_UART0_RST_N|SYSCON_PRESETCTRL_UARTFRG_RST_N;
    44.    

    45.     LPC_SYSCON->SYSAHBCLKCTRL|=SYSCON_SYSAHBCLKCTRL_SWM;
    46.     Swm_set(U0_RXD,0);
    47.     Swm_set(U0_TXD,4);
    48.     LPC_SYSCON->SYSAHBCLKCTRL&=~SYSCON_SYSAHBCLKCTRL_SWM;
    49.    
    50.    
    51.     LPC_SYSCON->UARTCLKDIV=4;/* Something is not clear. 60M/4=15M.*/
    52.     LPC_SYSCON->UARTFRGDIV=255;
    53.     LPC_SYSCON->UARTFRGMULT=4;
    54.     LPC_USART0->BRG=7;
    55.    
    56.     LPC_USART0->CFG=(1<<USART_CFG_DATALEN_SHIFT);
    57.    
    58.     LPC_USART0->INTENSET|=USART_INTENSET_RXRDYEN;
    59.    
    60.     NVIC_EnableIRQ(UART0_IRQn);
    61.    
    62.     LPC_USART0->CFG|=USART_CFG_ENABLE;
    63. }

    复制代码





    其中用到了swm中的Swm_set.
    贴到下面:
    这是.c文件.
    1. #include "./bsp/peripheral/swm.h"
    2. #include "./bsp/chip/LPC8xx.h"

    3. void Swm_set(TYPE_E_PERI_FUNCTION f,unsigned char pin_num){
    4.     unsigned char temp=f/4;
    5.     unsigned char shift=(f%4)*8;
    6.     unsigned long temp_reg=LPC_SWM->PINASSIGN[temp];
    7.     temp_reg&=~(0x000000FF<<shift);
    8.     temp_reg|=pin_num<<shift;
    9.     LPC_SWM->PINASSIGN[temp]=temp_reg;
    10. }

    复制代码
    这是.h文件.
    1. #ifndef _SWM_H_
    2. #define _SWM_H_

    3. #define SYSCON_SYSAHBCLKCTRL_SWM        ((unsigned long)1<<7)
    4.    
    5. typedef enum{
    6.     U0_TXD=0,
    7.     U0_RXD=1,
    8.     U0_RTS=2,
    9.     U0_CTS=3,
    10.     U0_SCLK=4,
    11.     U1_TXD=5,
    12.     U1_RXD=6,
    13.     U1_RTS=7,
    14.     U1_CTS=8,
    15.     U1_SCLK=9,
    16.     U2_TXD=10,
    17.     U2_RXD=11,
    18.     U2_RTS=12,
    19.     U2_CTS=13,
    20.     U2_SCLK=14,
    21.     SPI0_SCK=15,
    22.     SPI0_MOSI=16,
    23.     SPI0_MISO=17,
    24.     SPI0_SSEL0=18,
    25.     SPI0_SSEL1=19,
    26.     SPI0_SSEL2=20,
    27.     SPI0_SSEL3=21,
    28.     SPI1_SCK=22,
    29.     SPI1_MOSI=23,
    30.     SPI1_MISO=24,
    31.     SPI1_SSEL0=25,
    32.     SPI1_SSEL1=26,
    33.     SCT_PIN0=27,
    34.     SCT_PIN1=28,
    35.     SCT_PIN2=29,
    36.     SCT_PIN3=30,
    37.     SCT_OUT0=31,
    38.     SCT_OUT1=32,
    39.     SCT_OUT2=33,
    40.     SCT_OUT3=34,
    41.     SCT_OUT4=35,
    42.     SCT_OUT5=36,
    43.     I2C1_SDA=37,
    44.     I2C1_SCL=38,
    45.     I2C2_SDA=39,
    46.     I2C2_SCL=40,
    47.     I2C3_SDA=41,
    48.     I2C3_SCL=42,
    49.     ADC_PINTRIG0=43,
    50.     ADC_PINTRIG1=44,
    51.     ACMP_O=45,
    52.     CLKOUT=46,
    53.     GPIO_INT_BMAT=47,
    54. }TYPE_E_PERI_FUNCTION;

    55. void Swm_set(TYPE_E_PERI_FUNCTION f,unsigned char pin_num);

    56. #endif//_SWM_H_..

    复制代码
    好了,关于上面的代码,还是参考了一下官方的教程.不过也是全部自己理解后写出来的.
    如有疑问,可以留言.



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

    使用道具 举报

  • TA的每日心情
    开心
    2023-6-2 13:32
  • 签到天数: 272 天

    连续签到: 1 天

    [LV.8]以坛为家I

    44

    主题

    995

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    4413
    最后登录
    2023-6-2
     楼主| 发表于 2016-12-2 12:36:03 | 显示全部楼层
    当然,如果要用printf函数.还要加这下面的东西.

    1. #include <stdio.h>

    2. #pragma import(__use_no_semihosting_swi)


    3. extern void u_putc(unsigned char ch);  /* in Serial.c */

    4. struct __FILE { int handle; /* Add whatever you need here */ };
    5. FILE __stdout;


    6. int fputc(int ch, FILE *f) {
    7.     u_putc((unsigned char)ch);
    8.     return(ch);
    9. }

    10. void _sys_exit(int return_code) {
    11.   while (1);    /* endless loop */
    12. }

    复制代码
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-7-24 08:30
  • 签到天数: 50 天

    连续签到: 1 天

    [LV.5]常住居民I

    22

    主题

    817

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1713
    最后登录
    2019-12-7
    发表于 2016-12-2 12:51:49 来自手机 | 显示全部楼层
    顶一个   
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-1-21 08:52
  • 签到天数: 861 天

    连续签到: 1 天

    [LV.10]以坛为家III

    75

    主题

    2523

    帖子

    24

    金牌会员

    Rank: 6Rank: 6

    积分
    5867
    最后登录
    2025-1-22
    发表于 2016-12-2 12:57:15 | 显示全部楼层
    谢谢分享
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2025-5-29 08:54
  • 签到天数: 2992 天

    连续签到: 8 天

    [LV.Master]伴坛终老

    45

    主题

    5548

    帖子

    22

    金牌会员

    Rank: 6Rank: 6

    积分
    12035
    最后登录
    2025-5-29
    发表于 2016-12-2 23:05:50 | 显示全部楼层
    顶一个,,
    签到签到
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2018-7-23 21:04
  • 签到天数: 103 天

    连续签到: 1 天

    [LV.6]常住居民II

    228

    主题

    5379

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    16702
    最后登录
    1970-1-1
    发表于 2016-12-2 23:53:04 | 显示全部楼层
    多谢分享
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2023-6-2 13:32
  • 签到天数: 272 天

    连续签到: 1 天

    [LV.8]以坛为家I

    44

    主题

    995

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    4413
    最后登录
    2023-6-2
     楼主| 发表于 2016-12-27 09:53:20 | 显示全部楼层
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2017-1-17 09:56
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    6

    主题

    49

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    425
    最后登录
    2020-10-17
    发表于 2016-12-28 00:15:42 | 显示全部楼层
    签到 领金币
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2017-1-24 08:47
  • 签到天数: 49 天

    连续签到: 1 天

    [LV.5]常住居民I

    0

    主题

    524

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1267
    最后登录
    2017-4-19
    发表于 2016-12-28 08:37:20 | 显示全部楼层
    谢谢分享                           
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

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

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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