前几天刚刚自学了TM4C123gh6pm和TivaWare C的基础知识,想用Launchpad使单片机和台式机实现串口通信,下面附上我改的的调试代码图片。在CCS上编译可通过,但是当打开串口调试小助手进行数据发送与接收的时候始终没有数据回显。。。希望能人之士可以帮忙解决我的这个问题。。。
我在网上搜索了很多资料,但是都没有完整的可成功运行的例子。于是我有回去翻了翻TM4C123gh6pm的datasheet,在熟悉了硬件的相关管道和管脚说明之后,编写了下面的串口调试程序
1 #include <stdint.h> 2 #include <stdbool.h> 3 #include <string.h> 4 #include "driverlib/uart.h" 5 #include "driverlib/gpio.h" 6 #include "inc/hw_ints.h" 7 #include "inc/hw_memmap.h" 8 #include "inc/hw_types.h" 9 #include "inc/hw_gpio.h" 10 #include "driverlib/interrupt.h" 11 #include "LCDDriver.h" 12 13 14 char Character[6] = {0};//定义 Character 为全局变量 15 void UART0_Int_Handler(void) 16 17 { 18 //中断标志的读取、处理和清除 19 unsigned long ulStatus; 20 IntMasterDisable();//使能全局中断 21 ulStatus = UARTIntStatus(UART0_BASE, true); 22 UARTIntClear(UART0_BASE, ulStatus); 23 24 //根据中断标志处理相关事件 25 if(ulStatus & UART_INT_RX) 26 { 27 int k,i; 28 for(k = 0; k < 6; k++) 29 { 30 Character[k] = UARTCharGet(UART0_BASE); 31 } 32 LCD_Draw_String(Character, ENUM_LINE_EIGHT, 3, LCD_DRAW_NORMAL); 33 for(i = 12;i < 18;i++) 34 { 35 LCD_Draw_Char_8x8('#', ENUM_LINE_EIGHT, i, LCD_DRAW_NORMAL); 36 } 37 } 38 IntMasterEnable();//使能全局中断 39 } 40 41 void Int_GPIO_C_Handler(void) 42 { 43 IntMasterDisable();//使能全局中断 44 // 读取中断状态 45 unsigned long ulStatus; 46 ulStatus = GPIOIntStatus(GPIO_PORTC_BASE, true); 47 // 清除中断状态 48 GPIOIntClear(GPIO_PORTC_BASE, ulStatus); 49 // 如果KEY的中断状态有效 50 if (ulStatus & GPIO_PIN_7) //PC7 s1 51 { 52 // 延时约10ms,消除按键抖动 53 SysCtlDelay(20 * (SysCtlClockGet() / 3000)); 54 // 等待KEY抬起 55 while (GPIOPinRead(GPIO_PORTC_BASE, GPIO_PIN_7) == 0x00); 56 // 延时约10ms,消除松键抖动 57 SysCtlDelay(20 * (SysCtlClockGet() / 3000)); 58 59 int j; 60 for(j=3;j<21;j++) 61 { 62 LCD_Draw_Char_8x8('-', ENUM_LINE_EIGHT, j, LCD_DRAW_NORMAL); 63 } 64 65 } 66 IntMasterEnable();//使能全局中断 67 } 68 69 70 //按键 PD6 中断处理 71 void Int_GPIO_D_Handler(void) 72 { 73 IntMasterDisable();//使能全局中断 74 unsigned char newchar = '$'; 75 unsigned long ulStatus; 76 // 读取中断状态 77 ulStatus = GPIOIntStatus(GPIO_PORTD_BASE, true); 78 // 清除中断状态 79 GPIOIntClear(GPIO_PORTD_BASE, ulStatus); 80 // 如果KEY的中断状态有效 81 if (ulStatus & GPIO_PIN_6) //PD6 s2 82 { 83 // 延时约10ms,消除按键抖动 84 SysCtlDelay(20 * (SysCtlClockGet() / 3000)); 85 // 等待KEY抬起 86 while (GPIOPinRead(GPIO_PORTD_BASE, GPIO_PIN_6) == 0x00); 87 // 延时约10ms,消除松键抖动 88 SysCtlDelay(20 * (SysCtlClockGet() / 3000)); 89 90 //发送新字符 91 UARTCharPut(UART0_BASE, newchar); 92 } 93 IntMasterEnable();//使能全局中断 94 95 if(ulStatus & GPIO_PIN_7) //PD7 s3 96 { 97 // 延时约10ms,消除按键抖动 98 SysCtlDelay(20 * (SysCtlClockGet() / 3000)); 99 // 等待KEY抬起 100 while (GPIOPinRead(GPIO_PORTD_BASE, GPIO_PIN_7) == 0x00); 101 // 延时约10ms,消除松键抖动 102 SysCtlDelay(20 * (SysCtlClockGet() / 3000)); 103 //显示一个字符* 104 UARTCharPut(UART0_BASE, '*'); 105 //改变波特率 106 UARTConfigSetExpClk(UART0_BASE, SysCtlClockGet(), 115200, 107 UART_CONFIG_WLEN_8 | UART_CONFIG_PAR_NONE | UART_CONFIG_STOP_ONE); 108 109 } 110 IntMasterEnable();//使能全局中断 111 } 112 113 //初始化LCD 114 void Init_LCD(void) 115 { 116 LCD_Enable(); 117 LCD_Init(); 118 LCD_ScreenClr(); 119 } 120 121 //初始化 UART 模块 122 void Init_UART(void) 123 { 124 //初始化和配置 UART 模块,PA0/PA1 125 SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); 126 SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); 127 GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); 128 UARTConfigSetExpClk(UART0_BASE, SysCtlClockGet(), 9600, UART_CONFIG_WLEN_8 | UART_CONFIG_PAR_NONE | UART_CONFIG_STOP_ONE); 129 130 //UART 中断配置 131 UARTFIFOLevelSet(UART0_BASE, UART_FIFO_TX7_8, UART_FIFO_RX1_8); 132 UARTIntRegister(UART0_BASE, UART0_Int_Handler); 133 134 UARTIntEnable(UART0_BASE, UART_INT_RX); 135 //使UART传输数据使能 136 UARTIntEnable(UART0_BASE, UART_INT_TX); 137 } 138 139 //初始化按键 PC7和PD6 140 void Init_Key(void) //同时初始化PC7和PD7|PD7 141 { 142 //PC|PD按键解锁等等 143 HWREG(GPIO_PORTC_BASE | GPIO_PORTD_BASE + GPIO_O_LOCK) |= GPIO_LOCK_KEY; 144 HWREG(GPIO_PORTC_BASE | GPIO_PORTD_BASE + GPIO_O_CR) |= (1<<7); 145 HWREG(GPIO_PORTC_BASE | GPIO_PORTD_BASE + GPIO_O_DEN) &=(~(1<<7)); 146 HWREG(GPIO_PORTC_BASE | GPIO_PORTD_BASE + GPIO_O_PDR) &= (~(1<<7)); 147 HWREG(GPIO_PORTC_BASE | GPIO_PORTD_BASE + GPIO_O_PUR) &= (~(1<<7)); 148 HWREG(GPIO_PORTC_BASE | GPIO_PORTD_BASE + GPIO_O_AFSEL) &=(~(1<<7)); 149 150 151 152 //PC7 和PD6|PD7按键配置 153 SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC | SYSCTL_PERIPH_GPIOD); 154 155 GPIODirModeSet(GPIO_PORTC_BASE , GPIO_PIN_7, GPIO_DIR_MODE_IN); 156 GPIOPadConfigSet(GPIO_PORTC_BASE , GPIO_PIN_7, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU); 157 158 GPIODirModeSet( GPIO_PORTD_BASE, GPIO_PIN_6|GPIO_PIN_7, GPIO_DIR_MODE_IN); 159 GPIOPadConfigSet( GPIO_PORTD_BASE, GPIO_PIN_6|GPIO_PIN_7, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU); 160 161 //PC7和PD6|PD7中断配置 162 GPIOIntTypeSet(GPIO_PORTC_BASE , GPIO_PIN_7, GPIO_LOW_LEVEL); 163 GPIOIntTypeSet( GPIO_PORTD_BASE, GPIO_PIN_6|GPIO_PIN_7, GPIO_LOW_LEVEL); 164 GPIOIntRegister(GPIO_PORTC_BASE, Int_GPIO_C_Handler); 165 GPIOIntRegister(GPIO_PORTD_BASE, Int_GPIO_D_Handler); 166 167 GPIOIntEnable(GPIO_PORTC_BASE , GPIO_PIN_7); 168 GPIOIntClear( GPIO_PORTC_BASE, GPIO_PIN_7); 169 170 GPIOIntEnable( GPIO_PORTD_BASE, GPIO_PIN_6|GPIO_PIN_7); 171 GPIOIntClear( GPIO_PORTD_BASE, GPIO_PIN_6|GPIO_PIN_7); 172 173 IntEnable(INT_UART0_TM4C123); 174 IntMasterEnable();//使能全局中断 175 } 176 177 int main(void) 178 { 179 180 SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ); 181 182 Init_LCD();//初始化 LCD 183 Init_UART();//初始化 UART 184 Init_Key();//初始化按键 PC7和PD6|PD7 185 186 //屏幕上固定显示通信参数 187 LCD_Draw_String("UART0_Test... ", ENUM_LINE_ONE, 0, LCD_DRAW_NORMAL); 188 LCD_Draw_String("BaudRate: 9600", ENUM_LINE_THREE, 0, LCD_DRAW_NORMAL); //波特率 189 LCD_Draw_String("BaudRate*: 115200", ENUM_LINE_FOUR, 0, LCD_DRAW_NORMAL); //波特率 190 LCD_Draw_String("WordLength: 8", ENUM_LINE_FIVE, 0, LCD_DRAW_NORMAL); 191 LCD_Draw_String("Parity: None", ENUM_LINE_SIX, 0, LCD_DRAW_NORMAL); 192 LCD_Draw_String("Stop: 1", ENUM_LINE_SEVEN, 0, LCD_DRAW_NORMAL); 193 LCD_Draw_String("Re: ", ENUM_LINE_EIGHT, 0, LCD_DRAW_NORMAL); 194 195 while(1) 196 { 197 SysCtlDelay(SysCtlClockGet() / 12); 198 } 199 }
注意:在CCS上要添加相关的头文件合成工程文件和设置正确的路径才能达到编译正确。在进行串口调试的时候,需要用到串口调试小助手,具体操作可借鉴51芯片的串口调试过程。