UART两个例程分析( 二 )


【UART两个例程分析】因为为12MHZ且波特率为9600 , 得出来的参数(78 , 2 , 0 , 8)需要反映在程序的初始设置块中 。
注意前三个参数之间用逗号连接
const eUSCI_UART_ConfigV1 uartConfig ={EUSCI_A_UART_CLOCKSOURCE_SMCLK,// SMCLK Clock Source78,// BRDIV = 782,// UCxBRF = 20,// UCxBRS = 0EUSCI_A_UART_NO_PARITY,// No ParityEUSCI_A_UART_LSB_FIRST,// LSB FirstEUSCI_A_UART_ONE_STOP_BIT,// One stop bitEUSCI_A_UART_MODE,// UART modeEUSCI_A_UART_OVERSAMPLING_BAUDRATE_GENERATION,// OversamplingEUSCI_A_UART_8_BIT_LEN// 8 bit data length};
在主函数中 , 首先需要配置关闭看门狗 , 选择UART功能引脚 , 配置时钟频率 , 配置UART , 使能UART 。完成这些后进入中断服务程序 。
int main(void){//关闭看门狗MAP_WDT_A_holdTimer();//选择P1.2和P1.3为UART功能引脚MAP_GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P1,GPIO_PIN2 | GPIO_PIN3, GPIO_PRIMARY_MODULE_FUNCTION);/* Setting DCO to 12MHz (改后面的数字 , xMHZ)*/CS_setDCOCenteredFrequency(CS_DCO_FREQUENCY_12);//![Simple UART Example]//配置UART模块MAP_UART_initModule(EUSCI_A0_BASE, &uartConfig);//使能UART模块MAP_UART_enableModule(EUSCI_A0_BASE);//中断使能MAP_UART_enableInterrupt(EUSCI_A0_BASE, EUSCI_A_UART_RECEIVE_INTERRUPT);MAP_Interrupt_enableInterrupt(INT_EUSCIA0);MAP_Interrupt_enableSleepOnIsrExit();MAP_Interrupt_enableMaster();while(1){MAP_PCM_gotoLPM0();}}
在中断服务程序中 , 流程同前面的GPIO中断例程分析:即先定义出一个中断状态变量 。如果有多个接口 , 就一次性获取这些接口的中断状态 。再使用清理终端标志位的函数清掉获取来的标志位后按位和中断标志位相与 , 这个的目的是判断是否接收到了中断 。如果接收到了的话进行相应的中断传递 。
//用户配置的中断服务程序void EUSCIA0_IRQHandler(void){uint32_t status = MAP_UART_getEnabledInterruptStatus(EUSCI_A0_BASE);//获取中断状态//如果接收到的中断 , 进行信息传递if(status & EUSCI_A_UART_RECEIVE_INTERRUPT_FLAG){MAP_UART_transmitData(EUSCI_A0_BASE, MAP_UART_receiveData(EUSCI_A0_BASE));}}
这个历程的功能是返回用户在上输入的值
点击这个按键后 ,  选择至 模式 , 之后系统会自动配置 , 点确定即可 。
这里系统只可以检测英文 , 不支持中文字符 。配置好后点input field按钮 , 出来相应的输入框
之后输入英文字符就可 , 如输入HELLO WORLD!后在上面的框中会显示相同的字符
UART例程2
注意这里定义的是字符 。在中可以定义变量的大小 , 如 等
思路是定义两个八字节的变量 , 对应输出和输入 , 起名为(再传输给电脑屏幕的)和(用于接收用户给的字符) , 再借助已经封装好的函数传入数据 。
再在定义引脚阶段给出对LED灯引脚的定义 , 如果不等于就让灯亮
由于好奇再看一下这个函数
uint8_t UART_receiveData(uint32_t moduleInstance){/* If interrupts are not used, poll for flags */if (!BITBAND_PERI(EUSCI_A_CMSIS(moduleInstance)->IE, EUSCI_A_IE_RXIE_OFS))while (!BITBAND_PERI(EUSCI_A_CMSIS(moduleInstance)->IFG, EUSCI_A_IFG_RXIFG_OFS));return EUSCI_A_CMSIS(moduleInstance)->RXBUF;}
发现用到了一些标志位 , 是用来控制内置寄存器收发的 , 也与上面的文字分析部分流程相同 。
代码如下: