在线时间276 小时
UID2086952
注册时间2015-8-9
NXP金币253
TA的每日心情 | 开心 2023-6-2 13:32 |
---|
签到天数: 272 天 连续签到: 1 天 [LV.8]以坛为家I
金牌会员
 
- 积分
- 4413
- 最后登录
- 2023-6-2
|
本帖最后由 andrewz 于 2016-12-2 12:34 编辑
调好了时钟,对于这块已经无法用swd进行调试的"半残"板子,立马做的事情就是调串口.
下面是代码,部分代码涉及更多应用方面的内容,就删除了.只保留最底层的部分.
- #define _UART_GLOBAL_
- #include "./bsp/peripheral/uart.h"
- #include "./bsp/chip/LPC8xx.h"
- #include "./bsp/peripheral/swm.h"
- #define SYSCON_SYSAHBCLKCTRL_UART0 ((unsigned long)1<<14)
- #define SYSCON_PRESETCTRL_UARTFRG_RST_N ((unsigned long)1<<2)
- #define SYSCON_PRESETCTRL_UART0_RST_N ((unsigned long)1<<3)
- #define USART_CFG_ENABLE ((unsigned long)1<<0)
- #define USART_CFG_DATALEN_MASK ((unsigned long)0x0000000C)
- #define USART_CFG_DATALEN_SHIFT ((unsigned long)2)
- #define USART_INTENSET_RXRDYEN ((unsigned long)1<<0)
- #define USART_INTENSET_TXRDYEN ((unsigned long)1<<2)
- #define USART_INTENCLR_TXRDYCLR ((unsigned long)1<<2)
- #define USART_STAT_RXRDY ((unsigned long)1<<0)
- #define USART_STAT_TXRDY ((unsigned long)1<<2)
-
- void enable_tx_int(void);
- void disable_tx_int(void);
- unsigned char temp_o;
- unsigned char temp_i;
- void UART0_IRQHandler(void){
- if(LPC_USART0->STAT&USART_STAT_RXRDY){
- temp_i=LPC_USART0->RXDAT;
- }
- if(LPC_USART0->STAT&USART_STAT_TXRDY){
- LPC_USART0->TXDAT=temp_o;
- }
- }
- void enable_tx_int(void){
- LPC_USART0->INTENSET|=USART_INTENSET_TXRDYEN;
- }
- void disable_tx_int(void){
- LPC_USART0->INTENCLR|=USART_INTENCLR_TXRDYCLR;
- }
- void u_putc(unsigned char c){
- while((LPC_USART0->STAT&USART_STAT_TXRDY)==0);
- LPC_USART0->TXDAT=c;
- }
- void Uart_init(void){
- LPC_SYSCON->SYSAHBCLKCTRL|=SYSCON_SYSAHBCLKCTRL_UART0;
-
- LPC_SYSCON->PRESETCTRL&=~(SYSCON_PRESETCTRL_UART0_RST_N|SYSCON_PRESETCTRL_UARTFRG_RST_N);
- LPC_SYSCON->PRESETCTRL|=SYSCON_PRESETCTRL_UART0_RST_N|SYSCON_PRESETCTRL_UARTFRG_RST_N;
-
- LPC_SYSCON->SYSAHBCLKCTRL|=SYSCON_SYSAHBCLKCTRL_SWM;
- Swm_set(U0_RXD,0);
- Swm_set(U0_TXD,4);
- LPC_SYSCON->SYSAHBCLKCTRL&=~SYSCON_SYSAHBCLKCTRL_SWM;
-
-
- LPC_SYSCON->UARTCLKDIV=4;/* Something is not clear. 60M/4=15M.*/
- LPC_SYSCON->UARTFRGDIV=255;
- LPC_SYSCON->UARTFRGMULT=4;
- LPC_USART0->BRG=7;
-
- LPC_USART0->CFG=(1<<USART_CFG_DATALEN_SHIFT);
-
- LPC_USART0->INTENSET|=USART_INTENSET_RXRDYEN;
-
- NVIC_EnableIRQ(UART0_IRQn);
-
- LPC_USART0->CFG|=USART_CFG_ENABLE;
- }
复制代码
其中用到了swm中的Swm_set.
贴到下面:
这是.c文件.
- #include "./bsp/peripheral/swm.h"
- #include "./bsp/chip/LPC8xx.h"
- void Swm_set(TYPE_E_PERI_FUNCTION f,unsigned char pin_num){
- unsigned char temp=f/4;
- unsigned char shift=(f%4)*8;
- unsigned long temp_reg=LPC_SWM->PINASSIGN[temp];
- temp_reg&=~(0x000000FF<<shift);
- temp_reg|=pin_num<<shift;
- LPC_SWM->PINASSIGN[temp]=temp_reg;
- }
复制代码 这是.h文件.
- #ifndef _SWM_H_
- #define _SWM_H_
- #define SYSCON_SYSAHBCLKCTRL_SWM ((unsigned long)1<<7)
-
- typedef enum{
- U0_TXD=0,
- U0_RXD=1,
- U0_RTS=2,
- U0_CTS=3,
- U0_SCLK=4,
- U1_TXD=5,
- U1_RXD=6,
- U1_RTS=7,
- U1_CTS=8,
- U1_SCLK=9,
- U2_TXD=10,
- U2_RXD=11,
- U2_RTS=12,
- U2_CTS=13,
- U2_SCLK=14,
- SPI0_SCK=15,
- SPI0_MOSI=16,
- SPI0_MISO=17,
- SPI0_SSEL0=18,
- SPI0_SSEL1=19,
- SPI0_SSEL2=20,
- SPI0_SSEL3=21,
- SPI1_SCK=22,
- SPI1_MOSI=23,
- SPI1_MISO=24,
- SPI1_SSEL0=25,
- SPI1_SSEL1=26,
- SCT_PIN0=27,
- SCT_PIN1=28,
- SCT_PIN2=29,
- SCT_PIN3=30,
- SCT_OUT0=31,
- SCT_OUT1=32,
- SCT_OUT2=33,
- SCT_OUT3=34,
- SCT_OUT4=35,
- SCT_OUT5=36,
- I2C1_SDA=37,
- I2C1_SCL=38,
- I2C2_SDA=39,
- I2C2_SCL=40,
- I2C3_SDA=41,
- I2C3_SCL=42,
- ADC_PINTRIG0=43,
- ADC_PINTRIG1=44,
- ACMP_O=45,
- CLKOUT=46,
- GPIO_INT_BMAT=47,
- }TYPE_E_PERI_FUNCTION;
- void Swm_set(TYPE_E_PERI_FUNCTION f,unsigned char pin_num);
- #endif//_SWM_H_..
复制代码 好了,关于上面的代码,还是参考了一下官方的教程.不过也是全部自己理解后写出来的.
如有疑问,可以留言.
|
|