发新帖本帖赏金 5.00元(功能说明)我要提问
返回列表

【MSP430i2xx教程第二讲】时钟系统 & EUSCI_A_UART

[复制链接]
27038|276
手机看帖
扫描二维码
随时随地手机跟帖
xlhtracy|  楼主 | 2015-4-1 10:39 | 显示全部楼层 |阅读模式
本帖最后由 xlhtracy 于 2015-4-20 15:01 编辑

本教程作者为21ic网友@gaoyang9992006 ,回帖参与讨论、提问、分享,就能赢取超多丰厚奖励哦~  @gaoyang9992006 也将随时和大家交流学习中的问题。(PS:本教程未经允许,谢绝转载

活动说明详见:【学教程,送奖励】GET新技能,和gaoyang一起学习MSP430i2xx

第一讲链接(错过的去补课 ):
【MSP430i2xx教程第一讲】怎样使用库函数 & GPIO详解

第三、四讲也已经发布啦:
【MSP430i2xx教程第三讲】24-BitΣ-Δ 模数转换器 & FlashCtl-Flash存储控制器
感谢大家的热情参与,前两讲的获奖结果已公布,获奖的亲们向最终持之以恒奖冲刺吧!没获奖的亲们不要气馁,再接再励哈~

说的有点啰嗦了,下面正式开讲:




评分
参与人数 1威望 +1 收起 理由
吴鉴鹰 + 1 很给力!

相关帖子

xlhtracy|  楼主 | 2015-4-1 10:40 | 显示全部楼层
本帖最后由 xlhtracy 于 2015-4-10 12:31 编辑

第三章  时钟系统(CS
3.1  本章引言
  时钟系统(Clock System)模块支持低成本和低功耗。通过使用4个内部时钟信号,用户可以在低功耗和性能之间做到最好的平衡。
  时钟模块可以配置成无需任何外部组件,使用一个外部电阻器或完全使用DCO旁路模式。
  时钟模块有四个系统时钟信号可以使用:
  • ACLK:辅助时钟。当运行在DCO时,ACLK是固定在32kHz。如果设备是设置在DCO旁路模式,ACLK运行在旁路时钟频率的1/512
  • MCLK:主时钟。MCLK可以被1,2,4,816分频。MCLK通常被CPU和系统使用
  • SMCLK:子系统主时钟。SMCLK可以被1,2,4,816分频。SMCLK可以被各个外围模块通过软件选择使用。
  • SD24CLK:SD24时钟提供一个1.024MHz固定频率的时钟给Sigma-Delta ADC(SD24)。
  该时钟只为SD24的请求所使用。如果SD24功能必须在DCO旁路模式下工作,那么外部时钟频率必须是16.384Mhz
  这个驱动程序包含在cs.c文件里,cs.h头文件包含该应用程序使用的API定义

3.2  函数总览
  #define CS_DCO_FREQ  16384000


1
void GS_setupDCO ( uint8_t mode )
使用选中的模式配置DCO
2
void CS_initClockSignal (uint8_t clockSource, uint8_t clockSourceDivider)
使用分频器初始化时钟信号
3
uint32_t CS_getACLK (void)
获取当前ACLK的频率(单位Hz
4
uint32_t CS_getSMCLK (void)
获取当前SMCLK的频率(单位Hz
5
uint32_t CS_getMCLK (void)
获取当前MCLK的频率(单位Hz
6
uint8_t CS_getFaultFlagStatus (uint8_t mask)
获取DCO故障(或错误)标志状态

  CS API函数分为三组:配置时钟模块的、侦测时钟速度的和CS错误标记处理的。
  CS一般配置和初始化的函数有:
  • CS_setupDCO()
  • CS_initClockSignal()
  侦测时钟速度的函数有:
  • CS_getACLK()
  • CS_getSMCLK()
  • CS_getMCLK()
  CS错误标志处理的函数有
  • CS_getFaultFlagStatus()
  函数CS_getMCLK,CS_getSMCLK,CS_getACLK只在使用内部或外部电阻或者16.384MHz的旁路时钟频率下使用DCO才是精确有效的

详细描述
  uint32_t CS_getACLK(void)
  获取当前ACLK频率(单位Hz)。当设备安装在DCO旁路模式下,它不能正常工作。此外,使用这个API前应该调用CS_setupDCO(),以便DCO被校准,这样计算才是精确的。
  返回值:当前ACLK频率,单位Hz,当旁路模式下返回0

  uin8_t CS_getFaultFlagStatus(uint8_t mask)
  获取DCO错误标志状态。当DCO在外部电阻模式和DCO检测到异常时候,DCO故障标志将被置位(写1)。异常可能是,ROSC端子保持开路或者短接到地,或者连接在ROSC端子的电阻远离推荐的值。如果故障仍然存在,DCO就会自动切换到内部电阻模式作为一种处理故障的安全机制。
  mask:mask参数有CS_DCO_FAULT_FLAG.
  返回值:CS_DCO_FAULT_FLAG。说明错误标志被置位。

  uint32_t CS_getMCLK(void)
  获取当前MCLK频率(单位Hz)。当设备安装在DCO旁路模式下,它不能正常工作。此外,使用这个API前应该调用CS_setupDCO(),以便DCO被校准,这样计算才是精确的。
  返回值:当前MCLK频率,单位Hz,当旁路模式下返回0

  uint32_t CS_getSMCLK(void)
  获取当前SMCLK频率(单位Hz)。当设备安装在DCO旁路模式下,它不能正常工作。此外,使用这个API前应该调用CS_setupDCO(),以便DCO被校准,这样计算才是精确的。
  返回值:当前SMCLK频率,单位Hz,当旁路模式下返回0

  void CS_initClockSignal( uint8_t clockSource,  uint8_t clockSourceDivider )
  使用分频器初始化一个时钟信号。
  如果DCO是在旁路模式下,频率将是CLKIN/分频器。如果DCO不在旁路模式下,频率将是16.384MHz/分频器
  该函数有两个参数:clockSourceclockSourceDivider
  clockSource时钟信号初始化值可以选的值有:CS_MCLK,CS_SMCLK。
  clockSourceDivider分频器设置可选的值有CS_CLOCK_DIVIDER_1,CS_CLOCK_DIVIDER_2,CS_CLOCK_DIVIDER_4,CS_CLOCK_DIVIDER_8,CS_CLOCK_DIVIDER_16。
  返回值:无。

  void CS_setupDCO( uint8_t mode )
  使用参数所选模式配置DCO如果选择旁路模式,则需要在CLKIN管脚接入外部数字时钟信号来作为所有的设备(CPU、外设等)的时钟信号。ACLK频率是不可以被编程的,且固定在旁路时钟频率除以512。使用外部吊足模式,需要在ROSC管脚连接一个20KΩ的电阻器。与使用内部电阻相比,使用外部电阻模式,在绝对误差和温度漂移上,可以提供更高的时钟精度。请根据你所选的设备型号对应的数据手册的详细情况来选择不同的模式。
  该函数只有一个参数:mode。
  mode:该参数可以选择的量有CS_INTERNAL_RESISTOR,CS_EXTERNAL_RESISTOR,CS_BYPASS_MODE。
  返回值:空。
  注释:DCO的配置可以使用内部电阻和外部电阻,还有一个就是旁路模式,旁路模式就是可以通过一个时钟输入管脚将外部时钟信号灌入系统。


3.3  例程
  下面的例程演示如何配置CS模块,设置为SMCLK=DCO/2,MCLK=DCO/8。
//先配置DCO频率为16.384MHz.
CS_setupDCO(CS_INTERNAL_RESISTOR);
//配置完DCO才可以配置MCLKSMCLK
CS_initClockSignal(CS_MCLK,  CS_CLKOCK_DIVIDER_8);
CS_initClockSignal(CS_SMCLK,  CS_CLKOCK_DIVIDER_2);

使用特权

评论回复
xlhtracy|  楼主 | 2015-4-1 10:40 | 显示全部楼层
本帖最后由 xlhtracy 于 2015-4-1 11:45 编辑

第四章  EUSCI通用异步接收器/发送器(EUSCI_A_UART4.1  本章引言
  MSP430i2xx系列的EUSC_A_UART驱动库特性包括
  • 奇偶校验或非奇偶校验
  • 独立的发送和接收移位寄存器
  • 分立的发送和接收缓冲寄存器
  • 低位优先或高位优先数据发送和接收
  • 内置空闲线和地址位通信协议的多处理器系统
  • 具有从LPMx模式自动唤醒接收器启动的边缘检测
  • 用于错误检测和抑制的状态标志
  • 地址检测的状态标志
  • 用于接收和发送独立的中断能力
  在UART模式中,eUSCI在一定的位速率下,异步与另外一个设备进行字符的发送和接收。每个字符的时间长度是基于所选择的eUSCI波特率所固定的。因此,发送和接收函数要使用相同的波特率进行通信。
  这个驱动程序包含在eusci_a_uart.c文件里eusci_a_uart.h头文件包含该应用程序使用的API定义

4.2  函数总览
1
bool EUSCI_A_UART_init ( uint16_t baseAddress,EUSCI_A_UART_initParam *param )
先进的UART模块初始化程序,把初始化参数通过初始化函数写进时钟预分频器。
2
void EUSCI_A_UART_transmitData (uint16_t baseAddress, uint8_t transmitData)
UART模块发送出去一个字节
3
void EUSCI_A_UART_receiveData (uint16_t baseAddress)
接收一个字节数据。
4
void EUSCI_A_UART_enableInterrupt (uint16_t baseAddress,uint8_t mask)

使能UART(独立的)中断源
5
void EUSCI_A_UART_disableInterrupt (uint16_t baseAddress,uint8_t mask)
关闭UART(独立的)中断源
6
void EUSCI_A_UART_getInterruptStatus (uint16_t baseAddress,uint8_t mask)
获取当前UART中断状态
7
void EUSCI_A_UART_clearInterruptStatus (uint16_t baseAddress,uint8_t mask)
清除UART中断源。(备注:清除中断状态,重置中断状态标识)
8
void EUSCI_A_UART_enable (uint16_t baseAddress)
启用UART模块
9
void EUSCI_A_UART_disable (uint16_t baseAddress)
关闭UART模块
10
uint8_t EUSCI_A_UART_queryStatusFlags (uint16_t baseAddress, uint8_t mask)
获取当前UART状态标志.(查询UART当前状态标识)
11
void EUSCI_A_UART_setDormant(uint16_t baseAddress)
UART模块设置在休眠模式
12
void EUSCI_A_UART_resetDormant(uint16_t baseAddress)
UART模块从休眠模式唤醒
13
void EUSCI_A_UART_transmitAddress(uint16_t baseAddress,uint8_t transmitAddress)
根据所选的多处理器模式,传送下一个字节标记为地址
14
void EUSCI_A_UART_transmitBreak(uint16_t baseAddress)
发送终止
15
uint32_t EUSCI_A_UART_getReceiveBufferAddress(uint16_t baseAddress)
返回RX缓冲区的UARTDMA模块的地址。
16
uint32_t EUSCI_A_UART_getTransmitBufferAddress(uint16_t baseAddress)
返回TX缓冲区的UARTDMA模块的地址。
17
void EUSCI_A_UART_selectDeglitchTime(uint16_t baseAddress,uint16_t deglitchTime)
设置抗尖峰脉冲时间

  EUSI_A_UART_API提供了一组函数,用来实现一个中断驱动EUSI_A_UART的驱动程序。该EUSI_A_UART初始化的各种模式和功能是由EUSCI_A_UART_init()完成。这个函数初始化结束EUSI_A_UART保持禁用(所有的相关配置工作完成后才会通过函数启动UART)。EUSCI_A_UART_enable()使EUSI_A_UART,模块现在已经可以准备传输和接收了。
  建议通过EUSCI_A_UART_init()初始化EUSI_A_UART,使能所需的中断,然后通EUSCI_A_UART_enable()启用EUSI_A_UART
  EUSI_A_UART API函数分为三组:那些处理EUSI_A_UART模块配置和控制的,用于发送和接收数据的,管理中断和状态的。
  配置和控制EUSI_UART的函数有:
  • EUSCI_UART_init()
  • EUSCI_UART_enable()
  • EUSCI_UART_disable()
  • EUSCI_UART_setDormant()
  • EUSCI_UART_resetDormant()
  • EUSCI_UART_selectDeglithTime()

  通过EUSI_UART发送和接收数据的函数有:
  • EUSCI_UART_transmitData()
  • EUSCI_UART_receiveData()
  • EUSCI_UART_transmitAddress()
  • EUSCI_UART_transmitBreak()

  管理EUSI_UART中断和状态的函数有
  • EUSCI_UART_enableInterrupt()
  • EUSCI_UART_disableInterrupt()
  • EUSCI_UART_geInterruptStatus()
  • EUSCI_UART_clearInterrupt()
  • EUSCI_UART_queryStatusFlags()

  void EUSCI_A_UART_clearInterruptStatus (uint16_t baseAddress,uint8_t mask)
    清除UART中断源
    UART中断源被清除,所以它不再断言(计算机专业术语,大概意思就是:中断源被清除后,相关的不再执行,根据我们所接触过的类似的情况,可以看出来,清除中断标志后,才可以重新接收新一次的中断信号,本次中断信号已经完成,不再有效)。
    该函数共两个参数:baseAddressmask
  参数
baseAddress
EUSCI_A_UART模块的基地址
mask
将被清除中断源的位掩码。掩码值可以是以下量的逻辑或:
EUSCI_A_UART_RECEIVE_INTERRUPT_FLAG
EUSCI_A_UART_TRANSMIT_INTERRUPT_FLAG
EUSCI_A_UART_STARTBIT_INTERRUPT_FLAG
EUSCI_A_UART_TRANSMIT_COMPLETE_INTERRUPT_FLAG
    该函数修改UCAxIFG寄存器。
    返回值:无。

  void EUSCI_A_UART_disable (uint16_t baseAddress)
    关闭UART模块。
    该函数只有1个参数:baseAddress。
  参数
baseAddress
EUSCI_A_UART模块的基地址
    该函数修改UCAxCTL1寄存器的UCSWRST位。
    返回值:无。

  void EUSCI_A_UART_disableInterrupt (uint16_t baseAddress, uint8_t mask)
    关闭独立的UART中断源。
    禁用表示的UART中断源。只有启用的源可以反映给处理器进行中断。禁用的源不会影响到处理器的工作。
    该函数共两个参数:baseAddressmask
参数
baseAddress
EUSCI_A_UART模块的基地址
mask
掩码位对应的中断源将会被关闭。掩码值可以是以下量的逻辑或:
EUSCI_A_UART_RECEIVE_INTERRUPT                                 接收中断
EUSCI_A_UART_TRANSMIT_INTERRUPT                                   发送中断
EUSCI_A_UART_RECEIVE_ERRONEOUSCHAR_INTERRUPT   收到错误的字符中断使能
EUSCI_A_UART_BREAKCHAR_INTERRUPT                     接收间隔字符中断使能
EUSCI_A_UART_STARTBIT_INTERRUPT                           起始位接收中断启用
EUSCI_A_UART_TRANSMIT_COMPLETE_INTERRUPT                   发送完成中断使
    该函数修改UCAxCTL1寄存器的UCAxIE位。
    返回值:无。

使用特权

评论回复
xlhtracy|  楼主 | 2015-4-1 10:41 | 显示全部楼层
本帖最后由 xlhtracy 于 2015-4-1 11:44 编辑

  void EUSCI_A_UART_enable (uint16_t baseAddress)
    启用UART模块,这将能够操作UART模块
    该函数只有1个参数:baseAddress。
  参数
baseAddress
EUSCI_A_UART模块的基地址
    该函数修改UCAxCTL1寄存器的UCSWRST位。
    返回值:无。

  void EUSCI_A_UART_enableInterrupt (uint16_t baseAddress, uint8_t mask)
    启用独立的UART中断源。
    只有这个源使能启用后才能够反映到处理器中断;关闭源将不再影响到处理器。
注释:通过该函数启动中断源,才可以把中断事件产生的中标标志置位反映到处理器响应中断,进行中断,如果关闭了中断源,系统将不会把中断标志置位的信号传递给处理器,也不会响应中断。这就是为什么,总是看到,启动中断程序前都进行了中断标志位清零操作。
    该函数共两个参数:baseAddressmask
参数
baseAddress
EUSCI_A_UART模块的基地址
mask
掩码位对应的中断源将会被关闭。掩码值可以是以下量的逻辑或:
EUSCI_A_UART_RECEIVE_INTERRUPT                                       接收中断
EUSCI_A_UART_TRANSMIT_INTERRUPT                                     发送中断
EUSCI_A_UART_RECEIVE_ERRONEOUSCHAR_INTERRUPT 收到错误的字符中断使能
EUSCI_A_UART_BREAKCHAR_INTERRUPT                   接收间隔字符中断使能
EUSCI_A_UART_STARTBIT_INTERRUPT                         起始位接收中断启用
EUSCI_A_UART_TRANSMIT_COMPLETE_INTERRUPT                 发送完成中断使
    该函数修改UCAxCTL1寄存器的UCAxIE位。
    返回值:无。

  uint8_t EUSCI_A_UART_getInterruptStatus (uint16_t baseAddress, uint8_t mask)
    获取当前UART中断状态。
    这将为UART模块返回基于其传递的标志的中断状态。
    该函数共两个参数:baseAddressmask
  参数
baseAddress
EUSCI_A_UART模块的基地址
mask
返回掩码的中断标志位状态。掩码值可以是以下量的逻辑或:
EUSCI_A_UART_RECEIVE_INTERRUPT_FLAG
EUSCI_A_UART_TRANSMIT_INTERRUPT_FLAG
EUSCI_A_UART_STARTBIT_INTERRUPT_FLAG
EUSCI_A_UART_TRANSMIT_COMPLETE_INTERRUPT_FLAG
    该函数修改UCAxIFG寄存器。
    返回值
    下面量的逻辑或:
EUSCI_A_UART_RECEIVE_INTERRUPT_FLAG
EUSCI_A_UART_TRANSMIT_INTERRUPT_FLAG
EUSCI_A_UART_STARTBIT_INTERRUPT_FLAG
EUSCI_A_UART_TRANSMIT_COMPLETE_INTERRUPT_FLAG
    指示掩码标志状态。

  uint32_t EUSCI_A_UART_getReceiveBufferAddress (uint16_t baseAddress)
    为DMA模块返回UARTRX缓冲器地址
    这可以结合使用DMA直接接收到的数据存储到内存。
  参数
baseAddress
EUSCI_A_UART模块的基地址
    返回值:RX缓冲器地址。

  uint32_t EUSCI_A_UART_getTransmitBufferAddress (uint16_t baseAddress)
    为DMA模块返回UARTTX缓冲器地址
    这可以结合使用DMA直接接收到的数据存储到内存。
  参数
baseAddress
EUSCI_A_UART模块的基地址
    返回值:TX缓冲器地址。

  bool EUSCI_A_UART_init ( uint16 t baseAddress, EUSCI A UART initParam ∗ param )
  先进的UART模块初始化程序。
  被写进clockPrescalar(前置分频器),firstModReg,secondModRgeoverSampling(过采样)的参数应该提前计算好再传递给初始化函数。
  注释:oversampling指的是在对模拟信号进行采样的时候,采样频率比被采样信号的最大频率成分的两倍要高,即满足奈奎斯特采样定理(fs>=fmax)。
  在成功初始化UART模块前,这个函数将完成初始化该模块,单UART模块仍然是关闭的,必须使用函数EUSCI_A_UART_enable()使能启动。对于计算clockPrescalar,firstModReg,secondModReg和overSampling请使用下面链接:
  根据网页提供的工具可以方便的计算出初始化用的参数。如下图所示。
1.jpg
  参数
baseAddress
EUSCI_A_UART模块的基地址
mask
param是初始化结构体的指针。
    该函数修改寄存器UCAxCTL0UCPEN,UCPAR,UCMSB,UC7BIT,UCSPB,UCMODExUCSYNC位。
    返回值 STATUS_SUCCESS STATUS_FAIL
    注释:如果初始化成功了,返回STATUS_SUCCESS;如果初始化写入失败了,返回STATUS_FAIL

  uint8 t EUSCI_A_UART_queryStatusFlags ( uint16 t baseAddress, uint8 t mask )
    获取当前UART状态标志。
    该函数返回UART模块作为参数传送的标志位的状态
    注释:多次提到传送标志位的概念,意思就是,该函数中作为参数传送过去的标志位对应的当前状态将会作为返回值返回。
  参数
baseAddress
EUSCI_A_UART模块的基地址
mask
是将被返回的中断标志位状态掩码。
EUSCI_A_UART_LISTEN_ENABLE
EUSCI_A_UART_FRAMING_ERROR
EUSCI_A_UART_OVERRUN_ERROR
EUSCI_A_UART_BREAK_DETECT
EUSCI_A_UART_ADDRESS_RECEIVED
EUSCI_A_UART_IDLELINE
EUSCI_A_UART_BUSY
    该函数修改寄存器UCAxSTAT的位。
    返回值:下面量的逻辑或。
  • EUSCI_A_UART_LISTEN_ENABLE
  • EUSCI_A_UART_FRAMING_ERROR
  • EUSCI_A_UART_OVERRUN_ERROR
  • EUSCI_A_UART_BREAK_DETECT
  • EUSCI_A_UART_ADDRESS_RECEIVED
  • EUSCI_A_UART_IDLELINE
  • EUSCI_A_UART_BUSY


  uint8_t EUSCI_A_UART_receiveData ( uint16_t baseAddress )
    接收已经发送到UART模块的一个字节。该函数从UART接收数据寄存器读取一个字节数据。
  参数
baseAddress
EUSCI_A_UART模块的基地址
    该函数修改寄存器UCAxRXBUF
    返回值:返回从UART模块收到的字节,强制转换为uint8_t
    注释:函数的类型就是返回值的类型,函数内部返回值必须以函数类型返回。


  void EUSCI_A_UART_resetDormant ( uint16_t baseAddress )
    从休眠模式重启UART模块。不休眠,所有接收到字符就置位UCRXIFG

参数
baseAddress
EUSCI_A_UART模块的基地址
    该函数修改寄存器UCAxCTL1UCDORM位。
    返回值:无


  void EUSCI_A_UART_selectDeglitchTime ( uint16 t baseAddress, uint16 t deglitchTime )
    设置抗尖峰脉冲时间。
  参数
baseAddress
EUSCI_A_UART模块的基地址
deglitchTime
抗尖峰脉冲时间可选的值有:
EUSCI_A_UART_DEGLITCH_TIME_2ns
EUSCI_A_UART_DEGLITCH_TIME_50ns
EUSCI_A_UART_DEGLITCH_TIME_100ns
EUSCI_A_UART_DEGLITCH_TIME_200ns
    返回值:无


  void EUSCI_A_UART_setDormant ( uint16_t baseAddress )
    设置UART在休眠模式。在空闲线(串口线路闲置状态)或UCRXIFG置位前。
    在UART自动波特率检测模式,只有断点和同步字段组合才可置位UCRXIFG(在这种模式下,触发中断的条件)。
    参数
baseAddress
EUSCI_A_UART模块的基地址
    该函数修改寄存器UCAxCTL1
    返回值:无


void EUSCI_A_UART_transmitAddress ( uint16_t baseAddress, uint8_t transmitAddress )
    根据选择的多处理器模式,发送要被发送的标记为地址的下一个字节。
  参数
baseAddress
EUSCI_A_UART模块的基地址
transmitAddress
被发送的下一个字节
    该函数修改寄存器UCAxTXBUFUCAxCTL1
    返回值:无


  void EUSCI_A_UART_transmitBreak ( uint16_t baseAddress )

    传输中断(停止,暂停,间断)。
    传输中断(停止)作为下一个写入发送缓冲器。在UART的自动波特率检测模式下,
    EUSCI_A_UART_AUTOMATICBAUDRATE_SYNC(0x55) 必须被写进
    UCAxTXBUF来生成所需的中断/同步字段。否则,默认同步(0x00)必须写入传输缓冲区。另外确保模块为发送下一个数据做好准备。

参数
baseAddress
EUSCI_A_UART模块的基地址
    该函数修改寄存器UCAxTXBUFUCAxcTL1
    返回值:无


  void EUSCI_A_UART_transmitData ( uint16_t baseAddress, uint8_t transmitData )
    从UART模块发送一个字节。
    该函数放置提供的数据在UART发送数据寄存器里,并开始发送。
  参数
baseAddress
EUSCI_A_UART模块的基地址
transmitData
UART模块将要被发送出去的数据
    该函数修改寄存器UCAxTXBUF
    返回:无。

使用特权

评论回复
xlhtracy|  楼主 | 2015-4-1 10:41 | 显示全部楼层
本帖最后由 xlhtracy 于 2015-4-1 11:50 编辑

4.3  例程
例程将展示怎样使用EUSCI_A_UART API 来初始化EUSCI_A_UART并开始发送字符。
// 使用SMCLK频率为16384000Hz配置UART模块波特率为115200
// 可以在以下网址计算器计算出配置参数:
// http://software-dl.ti.com/msp430/msp430 public sw/mcu/msp430/MSP430BaudRateConverter/index.html

EUSCI_A_UART_ initParam uartConfig = {
EUSCI_A_UART_ CLOCKSOURCE SMCLK, // SMCLK Clock Source
8, // BRDIV = 8
14, // UCxBRF = 14
34, // UCxBRS = 34
EUSCI_A_UART_ NO PARITY, // No Parity
EUSCI_A_UART_ MSB FIRST, // MSB First
EUSCI_A_UART_ ONE STOP BIT, // One stop bit
EUSCI_A_UART_ MODE, // UART mode
EUSCI_A_UART_ OVERSAMPLING_BAUDRATE_GENERATION // Oversampling Baudrate
};
WDT_hold(WDT_BASE);
// 设置DCO使用内部电阻,DCO将被配置在16.384MHz.
CS_setupDCO(CS_INTERNAL RESISTOR);
// SMCLK设置与DCO相同的速度。SMCLK = 16.384MHz
CS_initClockSignal(CS_SMCLK, CS_CLOCK DIVIDER_1);
// 设置P1.2P1.3管脚作为UART管脚。P1.4 管脚作为LED输出
GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P1, GPIO_PIN2 | GPIO_PIN3, GPIO_PRIMARY_MODULE_FUNCTION);
GPIO_setAsOutputPin(GPIO_PORT_P1, GPIO_PIN4);
GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN4);
// 配置和使能UART外设
EUSCI_A_UART_ init(EUSCI_A0_BASE, &uartConfig);
EUSCI_A_UART_ enable(EUSCI_A0_BASE);
EUSCI_A_UART_ enableInterrupt(EUSCI_A0_BASE, EUSCI_A_UART_ RECEIVE_INTERRUPT);
while(1) {
EUSCI_A_UART_ transmitData(EUSCI_A0_BASE, TXData);
//进入休眠并等待退出LPM
__bis_SR_register(LPM0_bits | GIE);
}

使用特权

评论回复
xlhtracy|  楼主 | 2015-4-1 10:41 | 显示全部楼层
本帖最后由 xlhtracy 于 2015-4-1 11:54 编辑

4.4  详解
  UART主要是通过一个结构体来初始化的
  从eusci_a_uart.h我们可以看到该结构体为
typedef struct EUSCI_A_UART_initParam
{
uint8_t selectClockSource;
uint16_t clockPrescalar;
uint8_t firstModReg;
uint8_t secondModReg;
uint8_t parity;
uint16_t msborLsbFirst;
uint16_t numberofStopBits;
uint16_t uartMode;
uint8_t overSampling;
} EUSCI_A_UART_initParam;

  根据库函数头文件的介绍,第一个时钟源选择变量,一共有两个值可以选择。分别是使用SMCLKACLK作为UART时钟源
  第二个,第三个,第四个,我们可以不用管,直接利用网页的工具进行计算,如果想知道怎么手工计算,请查看技术手册。
  第五个parity是奇偶校验,一共三个选项,无奇偶校验、奇校验和偶校验。默认情况是无奇偶校验。
  第六个是msborLsbFirs,高位优先或低位优先,默认低位优先。
  第七个是numberofStopBits,停止位数量,可以选择1个停止位2个选择位。默认1个停止位。
  第八个是uartMode,共4个模式,默认是EUSCI_A_UART_MODE模式,还可以选择EUSCI_A_UART_IDLE_LINE_MULTI_PROCESSOR_MODE(空闲线多处理器模式)、 EUSCI_A_UART_ADDRESS_BIT_MULTI_PROCESSOR_MODE(地址位多处理器模式)和EUSCI_A_UART_AUTOMATIC_BAUDRATE_DETECTION_MODE(自动波特率检测模式)。
  第九个是overSampling,有两个值可以选择,分别用来指示使用过采样波特率发生器还是使用低频率波特率发生器。分别是EUSCI_A_UART_OVERSAMPLING_BAUDRATE_GENERATION和EUSCI_A_UART_LOW_FREQUENCY_BAUDRATE_GENERATION。
  详情参见技术手册相关章节。并在本帖后回复讨论。
  关于本章节函数的参数变量的选择,详情见eusci_a_uart.h

使用特权

评论回复
xlhtracy|  楼主 | 2015-4-1 10:43 | 显示全部楼层
本帖最后由 xlhtracy 于 2015-4-1 11:54 编辑

本章节的作业:
  根据例程,编写串口发送和接收程序,发送LED_ON字符串点亮接收MCULED,发送LED_OFF,关闭接收MCULED,发送LED_TEST字符串,返回当前的LED状态

使用特权

评论回复
xlhtracy|  楼主 | 2015-4-1 10:45 | 显示全部楼层
本帖最后由 xlhtracy 于 2015-4-1 11:57 编辑

资料下载:
第二讲完整课件内容下载: MSP430I2XX 教程第二讲.pdf (374.35 KB)

使用特权

评论回复
xlhtracy|  楼主 | 2015-4-1 10:45 | 显示全部楼层
占楼

使用特权

评论回复
dirtwillfly| | 2015-4-1 10:56 | 显示全部楼层
本帖最后由 dirtwillfly 于 2015-4-1 13:38 编辑

MSP430i2xx系列的时钟系统图
RTX截图未命名.png

使用特权

评论回复
强仔00001| | 2015-4-1 12:15 | 显示全部楼层
占座,有些问题:现在的MSP430的DCO产生的时钟频率和接外部晶振产生的频率那个更稳定和准确,还有DCO和外部晶振产生同等的频率下,那个更省电。我觉得楼主还有详细分析DCO这个部分

使用特权

评论回复
hanzhenfei| | 2015-4-1 12:40 | 显示全部楼层
前排这次

使用特权

评论回复
hanzhenfei| | 2015-4-1 12:44 | 显示全部楼层
DCO旁路模式什么概念?

使用特权

评论回复
hanzhenfei| | 2015-4-1 12:50 | 显示全部楼层
晓得了

使用特权

评论回复
dirtwillfly| | 2015-4-1 13:22 | 显示全部楼层
强仔00001 发表于 2015-4-1 12:15
占座,有些问题:现在的MSP430的DCO产生的时钟频率和接外部晶振产生的频率那个更稳定和准确,还 ...

使用外部晶振更稳定。
至于哪个省电,这个还真不知道。我猜使用DCO更省电

使用特权

评论回复
dirtwillfly| | 2015-4-1 13:41 | 显示全部楼层
"外部高速时钟旁路"是一个配置位,用于旁路使用外部晶振的


内置的高速时钟振荡器使用外接晶振产生所需的时钟,当使用外部提供的时钟时(如使用有源振荡器),必须设置这个控制位旁路上述内置振荡器;你可以理解为该控制位控制内置高速振荡器的开启和关闭,使用外部提供的时钟时需要关闭内置振荡器。  

使用特权

评论回复
2546522197| | 2015-4-1 13:44 | 显示全部楼层
谢谢

使用特权

评论回复
7631001| | 2015-4-1 14:24 | 显示全部楼层
很好的教程,遗憾我没有板子练手

使用特权

评论回复
z1g1d1z1w| | 2015-4-1 15:08 | 显示全部楼层
不错的课程

使用特权

评论回复
pywmiss| | 2015-4-1 16:19 | 显示全部楼层
我也在学430,,,,一直用台湾的松翰单片机...
现在学430觉得很多不习惯的...感觉仿真也不那么顺利...拖得好久了...好辛苦
时钟分MCLK....SMCLK....一大堆...好烦的说..
另外,其实更重要的应该是如何才能做一个好的软件架构(如何定义IO状态...之类)...前后台...不阻塞/....每个例程都第一句都是..停止看门狗.....
说得很乱....证明我很纠结....

使用特权

评论回复
发新帖 本帖赏金 5.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:菜地里的西兰花

51

主题

1450

帖子

24

粉丝