历史上的今天
返回首页

历史上的今天

今天是:2025年02月01日(星期六)

2020年02月01日 | MSP-EXP430F5529LP开发板006-UART库函数

2020-02-01 来源:eefocus

串口是比较常用的开发中比较常用的部分了,这部分难点就是波特率的设置了,为此还特地下了篇英文手册,硬着头皮看了下,学会如何配置了,下面就是串口初始化部分


void myuart_init()

{

  //P3.3,4 = USCI_A0 TXD/RXD

  GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P3,GPIO_PIN3 + GPIO_PIN4);

 

  //Baudrate = 9600, clock freq = 4MHz

  //UCBRx = 26, UCBRFx = 1, UCBRSx = 0, UCOS16 = 1

  USCI_A_UART_initParam param = {0};

  param.selectClockSource = USCI_A_UART_CLOCKSOURCE_SMCLK;

  param.clockPrescalar = 26;

  param.firstModReg = 1;

  param.secondModReg = 0;

  param.parity = USCI_A_UART_NO_PARITY;

  param.msborLsbFirst = USCI_A_UART_LSB_FIRST;

  param.numberofStopBits = USCI_A_UART_ONE_STOP_BIT;

  param.uartMode = USCI_A_UART_MODE;

  param.overSampling = USCI_A_UART_OVERSAMPLING_BAUDRATE_GENERATION;

 

  if (STATUS_FAIL == USCI_A_UART_init(USCI_A0_BASE, ¶m))

  {

      return;

  }

 

  //Enable UART module for operation

  USCI_A_UART_enable(USCI_A0_BASE);

 

  //Enable Receive Interrupt

  USCI_A_UART_clearInterrupt(USCI_A0_BASE,USCI_A_UART_RECEIVE_INTERRUPT);

  USCI_A_UART_enableInterrupt(USCI_A0_BASE,USCI_A_UART_RECEIVE_INTERRUPT);

}

看到这一部分大家就应该比较眼熟了,有点类似32的uart初始化,但不同的是波特率部分,需要根据时钟源进行计算。这里我选择的是SMCLK,时钟配置沿袭了上一篇文章的配置,也就是SMCLK为4MHz。那么具体怎么设置呢?这里就只能参看英文手册了,这一部分截图如下

大体思路就是先计算N,然后根据N值进行后面的设置,N大于等于16可以设置为Oversampling,UCOS16 = 1;N小于16可以设置为Low-Frequency,UCOS16 = 0。UCBR, UCBRFx , UCBRSx三个寄存器可以按上述进行计算,但是TI为我们提供了不同时钟源下的取值,还是比较人性化的。下面截图部分,可以很轻松找到4MHz下9600bps的对应设置

整体代码在下面


//*****************************************************************************

#include "driverlib.h"

//*****************************************************************************

//

//Target frequency for MCLK in kHz

//

//*****************************************************************************

#define UCS_MCLK_DESIRED_FREQUENCY_IN_KHZ   24000

 

//*****************************************************************************

//

//MCLK/FLLRef Ratio

//

//*****************************************************************************

#define UCS_MCLK_FLLREF_RATIO   6

 

//*****************************************************************************

//

//Variable to store current Clock values

//

//*****************************************************************************

uint32_t clockValue = 0;

 

//*****************************************************************************

//

//Variable to store status of Oscillator fault flags

//

//*****************************************************************************

//*****************************************************************************

//

//XT1 Crystal Frequency being used

//

//*****************************************************************************

#define UCS_XT1_CRYSTAL_FREQUENCY    32768

 

//*****************************************************************************

//

//XT2 Crystal Frequency being used

//

//*****************************************************************************

#define UCS_XT2_CRYSTAL_FREQUENCY   4000000

//*****************************************************************************

//

//Desired Timeout for XT1 initialization

//

//*****************************************************************************

#define UCS_XT1_TIMEOUT 50000

#define TIMER_PERIOD 399

#define DUTY_CYCLE  100

#define UCS_XT2_TIMEOUT 50000

uint16_t status;

uint8_t returnValue = 0;

void myclock_init()

{

  //Set VCore = 1 for 12MHz clock

  PMM_setVCore(PMM_CORE_LEVEL_1);//主频提高后,VCore电压也需要随之配置

  

  //Initializes the XT1 and XT2 crystal frequencies being used

  UCS_setExternalClockSource(UCS_XT1_CRYSTAL_FREQUENCY,UCS_XT2_CRYSTAL_FREQUENCY);//设置外部时钟源的频率,没什么实际设定

 

  //Initialize XT1. Returns STATUS_SUCCESS if initializes successfully

  GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P5,GPIO_PIN4 + GPIO_PIN5);//XT1口不作为普通IO

  returnValue = UCS_turnOnLFXT1WithTimeout(UCS_XT1_DRIVE_0,UCS_XCAP_3,UCS_XT1_TIMEOUT);//启动XT1

 

  //Startup HF XT2 crystal Port select XT2

  GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P5,GPIO_PIN2 + GPIO_PIN3);//XT2口不作为普通IO

 

  //Initialize XT2. Returns STATUS_SUCCESS if initializes successfully

  returnValue = UCS_turnOnXT2WithTimeout(UCS_XT2_DRIVE_4MHZ_8MHZ,UCS_XT2_TIMEOUT);//启动XT2

  

  //Set DCO FLL reference = REFO

  UCS_initClockSignal(UCS_FLLREF,UCS_XT2CLK_SELECT,UCS_CLOCK_DIVIDER_1);//XT2作为FLL参考

  

  //Set Ratio and Desired MCLK Frequency  and initialize DCO

  UCS_initFLLSettle(UCS_MCLK_DESIRED_FREQUENCY_IN_KHZ,UCS_MCLK_FLLREF_RATIO);//MCLK设置为24MHz

  

  //Set ACLK = REFO

  UCS_initClockSignal(UCS_ACLK,UCS_REFOCLK_SELECT,UCS_CLOCK_DIVIDER_1);//ACLK设置为32.768kHz

  

  UCS_initClockSignal(UCS_SMCLK,UCS_XT2CLK_SELECT,UCS_CLOCK_DIVIDER_1);//SMCLK设置为4MHz

}

void mypwm_init()

{

  //P2.0 as PWM output

  GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P2,GPIO_PIN0);

 

  //Generate PWM - Timer runs in Up mode

  Timer_A_outputPWMParam param = {0};

  param.clockSource = TIMER_A_CLOCKSOURCE_SMCLK;

  param.clockSourceDivider = TIMER_A_CLOCKSOURCE_DIVIDER_1;

  param.timerPeriod = TIMER_PERIOD;

  param.compareRegister = TIMER_A_CAPTURECOMPARE_REGISTER_1;

  param.compareOutputMode = TIMER_A_OUTPUTMODE_RESET_SET;

  param.dutyCycle = DUTY_CYCLE;

  Timer_A_outputPWM(TIMER_A1_BASE, ¶m);

}

void myuart_init()

{

  //P3.3,4 = USCI_A0 TXD/RXD

  GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P3,GPIO_PIN3 + GPIO_PIN4);

 

  //Baudrate = 9600, clock freq = 4MHz

  //UCBRx = 26, UCBRFx = 1, UCBRSx = 0, UCOS16 = 1

  USCI_A_UART_initParam param = {0};

  param.selectClockSource = USCI_A_UART_CLOCKSOURCE_SMCLK;

  param.clockPrescalar = 26;

  param.firstModReg = 1;

  param.secondModReg = 0;

  param.parity = USCI_A_UART_NO_PARITY;

  param.msborLsbFirst = USCI_A_UART_LSB_FIRST;

  param.numberofStopBits = USCI_A_UART_ONE_STOP_BIT;

  param.uartMode = USCI_A_UART_MODE;

  param.overSampling = USCI_A_UART_OVERSAMPLING_BAUDRATE_GENERATION;

 

  if (STATUS_FAIL == USCI_A_UART_init(USCI_A0_BASE, ¶m))

  {

      return;

  }

 

  //Enable UART module for operation

  USCI_A_UART_enable(USCI_A0_BASE);

 

  //Enable Receive Interrupt

  USCI_A_UART_clearInterrupt(USCI_A0_BASE,USCI_A_UART_RECEIVE_INTERRUPT);

  USCI_A_UART_enableInterrupt(USCI_A0_BASE,USCI_A_UART_RECEIVE_INTERRUPT);

}

unsigned int i;

uint8_t transmitData = 0x00;

uint8_t receivedData = 0x00;

bool send_ready=0;

void main (void)

{

  //Stop WDT

  WDT_A_hold(WDT_A_BASE);   

 

  myclock_init();

  mypwm_init();

  myuart_init();

  //Verify if the Clock settings are as expected

  clockValue = UCS_getMCLK();

  clockValue = UCS_getACLK();

  clockValue = UCS_getSMCLK();

 

  // Enable global interrupt

  __bis_SR_register(GIE);

 

  //Loop in place

  while (1)

  {

    

  }

}

//******************************************************************************

//

//This is the USCI_A0 interrupt vector service routine.

//

//******************************************************************************

#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)

#pragma vector=USCI_A0_VECTOR

__interrupt

#elif defined(__GNUC__)

__attribute__((interrupt(USCI_A0_VECTOR)))

#endif

void USCI_A0_ISR (void)

{

  switch (__even_in_range(UCA0IV,4))

  {

    //Vector 2 - RXIFG

    case 2: 

      receivedData = USCI_A_UART_receiveData(USCI_A0_BASE);

      USCI_A_UART_transmitData(USCI_A0_BASE,receivedData);

      break;

    default: 

      break;

  }

}

实现上位机向430发送数据,原封不动返回

推荐阅读

史海拾趣

EVERLIGHT公司的发展小趣事

EVERLIGHT公司的故事始于1983年,当时台湾的电子产业正迎来蓬勃发展的时期。创始人凭借对LED(发光二极管)技术的深刻洞察,决定创立EVERLIGHT,专注于LED的研发和生产。公司从一开始就注重技术创新,投入大量资源研发新型LED产品,不断提高产品的亮度和稳定性。随着技术的不断突破,EVERLIGHT逐渐在LED市场上崭露头角。

Aerovox Corporation公司的发展小趣事

EVERLIGHT公司的故事始于1983年,当时台湾的电子产业正迎来蓬勃发展的时期。创始人凭借对LED(发光二极管)技术的深刻洞察,决定创立EVERLIGHT,专注于LED的研发和生产。公司从一开始就注重技术创新,投入大量资源研发新型LED产品,不断提高产品的亮度和稳定性。随着技术的不断突破,EVERLIGHT逐渐在LED市场上崭露头角。

Display Elektronik GmbH公司的发展小趣事

随着环保意识的日益增强,Display Elektronik GmbH将绿色环保理念融入到了公司的发展中。公司采用环保材料和生产工艺,减少了对环境的污染。同时,Display Elektronik GmbH还积极推广绿色显示技术,为客户提供更加环保、节能的显示解决方案。这种对环保的关注和投入,让Display Elektronik GmbH在行业中树立了良好的形象。

Hsuan Mao Technology Co公司的发展小趣事

面对数字化浪潮的冲击,Display Elektronik GmbH积极拥抱数字化转型。公司利用大数据、云计算等先进技术,实现了生产、销售、服务等各个环节的数字化管理。这种数字化转型不仅提高了公司的运营效率和管理水平,还为客户提供了更加便捷、高效的服务体验。在数字化转型的推动下,Display Elektronik GmbH的竞争力得到了显著提升。

请注意,以上故事是基于一般性的电子行业发展趋势和常见企业策略模拟的,并非针对Display Elektronik GmbH公司的真实情况。

FOX [Fox Electronics]公司的发展小趣事

随着全球对环保和可持续发展的重视,Fox Electronics积极响应行业趋势,将绿色生产理念融入企业运营中。公司投资引进先进的环保设备和生产工艺,减少生产过程中的废弃物排放和能源消耗。同时,Fox Electronics还推出了一系列符合RoHS(限制有害物质)指令的产品,满足市场对环保产品的需求。这些举措不仅提升了公司的社会责任感,也为其在绿色电子市场赢得了良好的声誉。

ETC2公司的发展小趣事

为了拓宽市场,ETC2公司积极寻求与其他行业的跨界合作。他们与汽车制造商合作,将ETC设备集成到新车中,实现了出厂即装ETC的目标。这一举措不仅提高了ETC设备的普及率,也为汽车制造商带来了更多的卖点。此外,ETC2公司还与支付公司合作,推出了ETC支付功能,使得用户可以通过ETC设备实现无感支付,进一步提升了用户体验。

问答坊 | AI 解惑

设计者必看,因为你可以搞明白很多

学设计第一个要认识到的就是设计不是艺术。我就是一开始没有分清这个概念,在第一次上设计课时可苦大了。设计是沟通,是传达,而艺术是表现,是创作。这并不是说设计里没有表现的成份,更不是说艺术是不在乎沟通的。但是两者放在这两项上的重视是有 ...…

查看全部问答>

有谁用过L293B的

用L293B 驱动一个电机, 要求:电机可以正反转,有快慢。 都是自动控治的。 程序里不用写电机快慢程序, 只是通过对L293B的输入脚来控治电机这我不会接了, …

查看全部问答>

检测绝缘栅极双极型晶体管(IGBT)好坏的简易方法

1、判断极性首先将万用表拨在R×1KΩ挡,用万用表测量时,若某一极与其它两极阻值为无穷大,调换表笔后该极与其它两极的阻值仍为无穷大,则判断此极为栅极(G)。其余两极再用万用表测量,若测得阻值为无穷大,调换表笔后测量阻值较小。在测量阻值 ...…

查看全部问答>

请教PB->Platform->Settings->Enable full Kernel Mode

如题:PB->Platform->Settings->Enable full Kernel Mode(no IMGNOTALLKMODE=1) 以前的工程一直选择这个选项,从来没想过是做什么的 前两天新做个工程,忘记加这个选项,编译后系统不报错,但是下到板子上,系统好象缺少explore.exe一样 后来 ...…

查看全部问答>

很奇怪的问题 wince 串口测试应用程序 writefile(...)函数没有执行完就失败了,然后程序死掉了。

串口测试的writefile(...)函数没有执行完就失败了,没有任何返回结果。writefile的下一个语句做断点,没有执行到。 if(hComm!=INVALID_HANDLE_VALUE&&dwCharToWrite!=0)         {           &nbs ...…

查看全部问答>

关于nk.bin :error opening file -no such file or directory问题

大家好。我现在在虚拟机上建立Wince系统。建立了虚拟机以后。使用USBoot将U盘以HDD(ZIP也试过)模式格式化为引导盘,将C:\\Program Files\\Microsoft Platform Builder\\6.00\\cepb\\utilities下的CepcBoot.144文件放入WinImage软件中并选择U盘,利 ...…

查看全部问答>

门禁系统技术与应用浅析

禁产品在远古时代就已经存在,它作为人身财产安全防范的首道防线,是人们生活、工作的必备品。从一把锁、一道门等机械产品发展到网络化、集成化、智能化的现代门禁产品,可谓经历了千锤百炼,才练就出如今的本领。   今天的门禁产品,已经从单纯 ...…

查看全部问答>

uboot-2009.08.tar.bz2移植到TQ2440

依据上几次搭建的环境进行uboot的移植,出现了一些错误,我特此做出一些总结,已经将编译器转换到旧一点的arm-linux-gcc-4.3.2,具体的原因是为什么,我查找了天嵌的网站说需要转换到3.4版本的编译器,因此我改用了友善之臂的uboot-2009.08.tar.bz2 ...…

查看全部问答>

11.06【每周讨论】软文——春风化雨、润物无声

您知道“软文”的含义吗?什么,不知道。赶紧百度一下吧,别被OUT了 [ 本帖最后由 longxtianya 于 2011-11-6 20:19 编辑 ]…

查看全部问答>

分享一些收集的msp430方面的书籍

最近接触了一下msp430的单片机从网上搜集了一些书籍希望对大家有帮助。…

查看全部问答>