打印

【MSP430i2xx教程第三讲】24-BitΣ-Δ ADC & FlashCtl-Flash存储控制器

[复制链接]
20502|178
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 xlhtracy 于 2015-4-20 15:00 编辑

为了让大家更好的理解第三讲内容,我们在教程最后新增了几个问题方便大家学习探讨,第三讲活动时间延期三天至4月19日。


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

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

相关课程链接:(错过的去补课

【MSP430i2xx教程第二讲】时钟系统 & EUSCI_A_UART
这一讲有辣么点小难度,来挑战挑战呗~  

说的有点啰嗦了,下面正式开讲,不喜欢阅读帖子的亲可以直接下载第三讲的文档进行阅读
MSP430I2XX 教程第三讲.pdf (593.88 KB)


相关帖子

沙发
xlhtracy|  楼主 | 2015-4-9 09:45 | 只看该作者
本帖最后由 xlhtracy 于 2015-4-9 17:01 编辑

第五章  24-BitΣ模数转换器 5.1  本章引言
    SD24模块由多达四个(注释:根据封装不同最多4个,也可以是2个或者3)独立的Σ-Δ模数转换器构成。该转换器是基于二阶过采样Σ-Δ调制器和数字抽取滤波器。抽取滤波器是具有高达256可选择过采样率梳型滤波器。额外的滤波可以用软件来完成。
    一个Σ-Δ模数转换器基本上有两部分组成:模拟部分的调制器和数字部分的抽取滤波器。在SD24的调制器提供的01位流的数字抽取滤波器。
    数字滤波器的平均比特流从一个给定的比特数的调制器(通过过采样率指定)并且提供一个低码率的抽样为进一步给CPU处理。
    众所周知平均值可增加转换的信噪比性能。与传统的ADC相比4通道过采样每个因子可以提高约6分贝或1位的信噪比。
    实现一个16位分辨率的一个简单的1ADC需要过采样率为4^15 = 1.073.741.824,这是不切实际的。
    为了克服这个限制,Σ-Δ制器实现的技术称为噪声整形,由于一个实施的反馈环技术和集成的量化噪声被推动到更高的频率,因此低得多的过采样率足以达到高的分辨率。
    SD24特性包括:
  • 二阶Σ-Δ架构
  • 高达7(这个数量跟库函数手册有出入啊)可同时采样的ADC。(具体数量请参考对应型号手册)。
  • 固定的1.024 MHz调制器输入频率。
  • 软件可选择的内置和外置参考电压
  • 软件可选的全通道温度传感器
    下图给出SD24系统相关结构图,图5.1为基准信号系统图,图5.2ADC模块结构图。根据图5.2内部应该有7个通道的ADC,其中通道0~5是测量外部信号用,通道6是测量温度传感器模块的。秉承了G2测量内部温度的优良传统,对于自我温度监控很有帮助,可以很好的保证系统正常运行,比如温度过高时候休眠或降低系统频率,好神奇。
    有兴趣的朋友自己阅读MSP430i2xx家族用户手册,我们这里对内部寄存器不作具体研究,下面开始学习相关库函数。


5.2  函数总览
1
void SD24_init ( uint16_t baseAddress, uint8_t referenceSelect )
初始化SD24模块
2
void SD24_initConverter (uint16_t baseAddress, uint16_t converter, uint16_t conversionMode)
配置SD24转换器
3
void SD24_initConverterAdvanced (uint16_t baseAddress, SD24_initConverterAdvancedParam ∗param)
配置SD24转换器高级配置
4
void SD24_setConverterDataFormat (uint16_ baseAddress, uint16_t converter, uint16_t dataFormat)
设置SD24转换器数据格式
5
void SD24_startConverterConversion (uint16_t baseAddress, uint8_t converter)
转换器开始转换
6
void SD24_stopConverterConversion (uint16_t baseAddress, uint8_t converter)
停止转换器转换
7
void SD24_setInputChannel (uint16_t baseAddress, uint8_t converter, uint8_t inputChannel)
配置输入通道
8
void SD24_setInterruptDelay (uint16_t baseAddress, uint8_t converter, uint8_t interruptDelay)
为中断触发配置延迟
9
void SD24_setOversampling (uint16_t baseAddress, uint8_t converter, uint16_t oversampleRatio)
对转换器配置过采样率
10
void SD24_setGain (uint16_t baseAddress, uint8_t converter, uint8_t gain)
为转换器配置增益
11
uint32_t SD24_getResults (uint16_t baseAddress, uint8_t converter)
返回所选转换器的转换结果
12
uint16_t SD24_getHighWordResults (uint16_t baseAddress, uint8_t converter)
返回转换结果的高字位
13
void SD24_enableInterrupt (uint16_t baseAddress, uint8_t converter, uint16_t mask)
使能SD24模块中断。
14
void SD24_disableInterrupt (uint16_t baseAddress, uint8_t converter, uint16_t mask)
关闭SD24模块中断
15
void SD24_clearInterrupt (uint16_t baseAddress, uint8_t converter, uint16_t mask)
清除SD24模块中断(清除中断标志)。
16
uint16_t SD24_getInterruptStatus (uint16_t baseAddress, uint8_t converter, uint16_t mask)
返回SD24模块的中断标志

    函数分类
    SD24 API可以分成三组函数:那些处理初始化和转换的,那些处理中断的,还有那些处理SD24的辅助功能的
SD24 初始化和转换功能:
       SD24_init()
        SD24_initConverter()
        SD24_initConverterAdvanced()
        SD24_startConverterConversion()
        SD24_stopConverterConversion()
        SD24_getResults()
        SD24_getHighWordResults()

SD24 处理中断的有:
       SD24 enableInterrupt()
        SD24 disableInterrupt()
        SD24 clearInterrupt()
        SD24 getInterruptStatus()

SD24处理辅助功能的有:
        SD24 setInputChannel()
        SD24 setConverterDataFormat()
        SD24 setInterruptDelay()
        SD24 setOversampling()
        SD24 setGain()

使用特权

评论回复
板凳
xlhtracy|  楼主 | 2015-4-9 09:45 | 只看该作者
本帖最后由 xlhtracy 于 2015-4-9 10:22 编辑

详细描述
  void SD24_init ( uint16_t baseAddress, uint8_t referenceSelect )
    初始化 SD24 模块。此函数初始化SD24 模块∑-△模数转换。 具体的功能是为SD24核心设置用于转换的时钟源SD24 中断初始化完成后将重置寄存器,并且将以给定的参数设置。另外,转换器配置设置是独立于此函数的。
  参数
baseAddress
SD24模块的基地址
referenceSelect
选择参考源 SD24 核心有效的值为:
SD24_REF_EXTERNAL [Default]         默认的外部参考
SD24_REF_INTERNAL                 选择内部参考
  该函数修改寄存器SD24BCTL0SD24REFS
  返回:无。

  void SD24_initConverter (uint16_t baseAddress, uint16_t converter, uint16_t conversionMode)
    配置SD24转换器
    该函数初始化SD24模块的一个转换器。完成后转换器将准备好转换,并可开始用SD24_startConverterConversion()。 额外的配置,如数据格式可以在 SD24_setConverterDataFormat() 中进行配置。

void SD24_initConverterAdvanced (uint16_t baseAddress, SD24_initConverterAdvancedParam ∗param)
    配置SD24转换器——高级配置。
    该函数初始化SD24模块的一个转换器。完成后,转换器将可以开始用 SD24_startConverterConversion()转换。
  参数
baseAddress
SD24模块的基地址
param
是指向转换器高级配置的结构体指针
    该函数修改寄存器SD24BCTL0SD24REFS
    返回:无。

Param具体成员如下:
1
SD24_initConverterAdvancedParam::converter
选择将要配置的转换器
2
SD24_initConverterAdvancedParam::conversionMode
转换模式,连续采样还是一次采样
3
SD24_initConverterAdvancedParam::groupEnable
分组使能,默认分组
4
SD24_initConverterAdvancedParam::inputChannel
输入通道选择,模拟通道还是温度通道
5
SD24_initConverterAdvancedParam::dataFormat
数据格式,二进制或2的补码形式
6
SD24_initConverterAdvancedParam::interruptDelay
中断延时设置,可以选择第一次采样中断或第四次采样中断
7
SD24_initConverterAdvancedParam:: oversampleRatio
过采样率选择,可以选择四种:32,64,128,256
8
SD24_initConverterAdvancedParam::gain
增益选择,共四种,1,2,4,8,16,默认是1
  以上8个结构体成员变量具体选择范围请参考sd24.h文件,注意有个inputChannel,TI在介绍里写错了,漏了。
请认真查看头文件,把不懂的那个找出来我们一起讨论讨论。我对35还不是很了解,哪位高手看的明白讲出来。


  void SD24_setConverterDataFormat (uint16_ baseAddress, uint16_t converter, uint16_t dataFormat)
    设置SD24转换器的数据格式
    该函数设置转换器格式,以便由此产生的数据可以以2进制或2的补码形式查看。
参数
baseAddress
SD24模块的基地址
converter
选择将要配置的转换器。可选值有:
SD24_CONVERTER_0
SD24_CONVERTER_1
SD24_CONVERTER_2
SD24_CONVERTER_3
dataFormat
选择结果以怎样的数据格式,可选值有:
SD24_DATA_FORMAT_BINARY [Default]
SD24_DATA_FORMAT_2COMPLEMENT
修改寄存器SD24CCTLxSD24DFx
  返回值:无。

void SD24_startConverterConversion (uint16_t baseAddress, uint8_t converter)
    转换器开始一个转换。
  参数
baseAddress
SD24模块的基地址
converter
选择转换器,可选的值有:
SD24_CONVERTER_0
SD24_CONVERTER_1
SD24_CONVERTER_2
SD24_CONVERTER_3
修改寄存器SD24CCTLx寄存器的SD24SC
  该函数修改寄存器SD24BCTLx的SD24SC
  返回:无。

  void SD24_stopConverterConversion (uint16_t baseAddress, uint8_t converter)
    停止转换器转换。
  参数
baseAddress
SD24模块的基地址
converter
选择将被停止的转换器,可选的值有:
SD24_CONVERTER_0
SD24_CONVERTER_1
SD24_CONVERTER_2
SD24_CONVERTER_3
修改寄存器SD24CCTLx寄存器的SD24SC
  该函数修改寄存器SD24BCTLx的SD24SC
  返回:无。
  我们通过寄存器就可以看出来和上面的开始转换刚好是相反操作的一对。

  void SD24_setInputChannel (uint16_t baseAddress, uint8_t converter, uint8_t inputChannel)
    该函数用于配置输入通道。MSP430i2xx系列单片机,用户可以选择模拟输入,也可以选择内部的温度传感器输入(跟G2xx类似的测量内部温度的方法)。
  参数
baseAddress
SD24模块的基地址
converter
选择将被停止的转换器,可选的值有:
SD24_CONVERTER_0
SD24_CONVERTER_1
SD24_CONVERTER_2
SD24_CONVERTER_3
修改寄存器SD24CCTLx寄存器的SD24SC
inputChannel
选择转换器的输入通道,可选值有:
SD24_INPUT_CH_ANALOG
SD24_INPUT_CH_TEMPERATURE
修改寄存器SD24INCTLxSD24INCHx
  返回:无。

  void SD24_setOversampling (uint16_t baseAddress, uint8_t converter, uint16_t oversampleRatio)
    为给定的转换器配置过采样率。
  参数
baseAddress
SD24模块的基地址
converter
选择将被停止的转换器,可选的值有:
SD24_CONVERTER_0
SD24_CONVERTER_1
SD24_CONVERTER_2
SD24_CONVERTER_3
oversampleRatio
选择转换器的过采样率,可选值有:
SD24_OVERSAMPLE_32
SD24_OVERSAMPLE_64
SD24_OVERSAMPLE_128
SD24_OVERSAMPLE_256
改寄存器SD24OSRxSD24OSRx
  返回:无。

使用特权

评论回复
地板
xlhtracy|  楼主 | 2015-4-9 09:45 | 只看该作者
本帖最后由 xlhtracy 于 2015-4-9 10:29 编辑

  void SD24_setGain (uint16_t baseAddress, uint8_t converter, uint8_t gain)
    配置转换器增益。
  参数
baseAddress
SD24模块的基地址
converter
选择将被停止的转换器,可选的值有:
SD24_CONVERTER_0
SD24_CONVERTER_1
SD24_CONVERTER_2
SD24_CONVERTER_3
gain
选择转换器的过采样率,可选值有:
SD24_GAIN_1                    默认值
SD24_GAIN_2
SD24_GAIN_4
SD24_GAIN_8
SD24_GAIN_16
修改寄存器SD24INCTLxSD24GAINx
  返回:无。

  uint32_t SD24_getResults (uint16_t baseAddress, uint8_t converter)
    返回转换器的结果。该函数从寄存器SD24MEMx16位和低16位获取结果,并把他们连接起来,实际上该结果是一个最大为24位的数字(因此我们不用考虑是高位对齐还是低位对齐了,因为库函数已经做好了一切,该处问题是,到底是高位对齐还是低位对齐,O(_)O哈哈~)。
  参数
baseAddress
SD24模块的基地址
converter
选择将要获取结果的转换器,可选的值有:
SD24_CONVERTER_0
SD24_CONVERTER_1
SD24_CONVERTER_2
SD24_CONVERTER_3
修改寄存器SD24CCTLx寄存器的SD24SC
  该函数修改寄存器SD24BCTLx的SD24SC
  返回:转换结果。

  uint16_t SD24_getHighWordResults (uint16_t baseAddress, uint8_t converter)
    该函数从寄存器SD24MEMx获取高16位结果,并返回该值。
  参数
baseAddress
SD24模块的基地址
converter
选择将要获取结果的转换器,可选的值有:
SD24_CONVERTER_0
SD24_CONVERTER_1
SD24_CONVERTER_2
SD24_CONVERTER_3
修改寄存器SD24CCTLx寄存器的SD24SC
  该函数修改寄存器SD24BCTLx的SD24SC
  返回:转换结果。

  void SD24_enableInterrupt (uint16_t baseAddress, uint8_t converter, uint16_t mask)
    该函数使能SD24模块对应中断。并不清除中断标志。
参数
baseAddress
SD24模块的基地址
converter
选择转换器,可选的值有:
SD24_CONVERTER_0
SD24_CONVERTER_1
SD24_CONVERTER_2
SD24_CONVERTER_3
mask
要被启用的变换器中断源的位掩码。掩码值是下面量值的逻辑或:
SD24_CONVERTER_INTERRUPT
SD24_CONVERTER_OVERFLOW_INTERRUPT
修改寄存器SD24BIESD24OVIEx
  返回:无。


  void SD24_disableInterrupt (uint16_t baseAddress, uint8_t converter, uint16_t mask)
    关闭SD24模块中断功能
  参数
baseAddress
SD24模块的基地址
converter
选择转换器,可选的值有:
SD24_CONVERTER_0
SD24_CONVERTER_1
SD24_CONVERTER_2
SD24_CONVERTER_3
mask
要被关闭的变换器中断源的位掩码。掩码值是下面量值的逻辑或:
SD24_CONVERTER_INTERRUPT
SD24_CONVERTER_OVERFLOW_INTERRUPT
修改寄存器SD24BIESD24OVIEx
  返回:无。

  void SD24_clearInterrupt (uint16_t baseAddress, uint8_t converter, uint16_t mask)
    该函数清除SD24模块中断标志
  参数
baseAddress
SD24模块的基地址
converter
选择转换器,可选的值有:
SD24_CONVERTER_0
SD24_CONVERTER_1
SD24_CONVERTER_2
SD24_CONVERTER_3
mask
要被清除掉的转换器对应的中断源的位掩码。掩码值是下面量值的逻辑或:
SD24_CONVERTER_INTERRUPT
SD24_CONVERTER_OVERFLOW_INTERRUPT
修改寄存器SD24BIFG的SD24OVIFGx
  返回:无。



  uint16_t SD24_getInterruptStatus (uint16_t baseAddress, uint8_t converter, uint16_t mask)
    该函数可以获取SD24模块的中断标志位状态
参数
baseAddress
SD24模块的基地址
converter
选择转换器,可选的值有:
SD24_CONVERTER_0
SD24_CONVERTER_1
SD24_CONVERTER_2
SD24_CONVERTER_3
mask
要返回的转换器中断源位掩码。掩码值是下面量值的逻辑或:
SD24_CONVERTER_INTERRUPT
SD24_CONVERTER_OVERFLOW_INTERRUPT
  返回:下列量值的逻辑或:
    SD24_CONVERTER_INTERRUPT
    SD24_CONVERTER_OVERFLOW_INTERRUPT
  表明对应掩码的中断状态。该函数可以知道是发生了什么中断。


使用特权

评论回复
5
xlhtracy|  楼主 | 2015-4-9 09:50 | 只看该作者
本帖最后由 xlhtracy 于 2015-4-9 10:49 编辑

5.3  例程
    本例程非完整程序,旨在展示如何初始化和而是用SD24API,以开始一个单通道转换。


unsigned long results;
SD24_init(SD24_BASE, SD24_REF_INTERNAL); // Select internal REF
SD24_initConverterAdvancedParam param = {0};
param. converter = SD24_CONVERTER_2; // Select converter
param. conversionMode = SD24_SINGLE_MODE; // Select single mode
param. groupEnable = SD24_NOT_GROUPED; // No grouped
param. inputChannel = SD24_INPUT_CH_ANALOG; // Input from analog signal
param. dataFormat = SD24_DATA_FORMAT_2COMPLEMENT; // 2’s complement data format
param. interruptDelay = SD24_FOURTH_SAMPLE_INTERRUPT; // 4th sample causes interrupt
param. oversampleRatio = SD24_OVERSAMPLE_256; // Oversampling ratio 256
param. gain = SD24_GAIN_1; // Preamplifier gain x1
SD24_initConverterAdvanced(SD24_BASE, ¶m);
delay cycles(0x3600); // Delay for 1.5V REF startup
while (1)
{
SD24_startConverterConversion(SD24_BASE,SD24_CONVERTER 2); // Set bit to start conversion
// Poll interrupt flag for channel 2
while( SD24_getInterruptStatus(SD24_BASE, SD24_CONVERTER_2,SD24_CONVERTER_INTERRUPT) == 0 );
results = SD24 getResults(SD24_BASE,SD24_CONVERTER_2); // Save CH2 results (clears IFG)
no operation(); // SET BREAKPOINT HERE
}

  讨论:根据例程,我们可以了解如何使用SD24的基本流程
  1, 选择参考REF是内置参考电压,还是选择外置参考电压。
  2, 高级配置转换器相关参数,共8个,这个很关键。
  3, 通过相关函数,将第2步配置的参数写入到系统。
  4, 延时一下,等待参考电压就绪,就可以启动转换器了。
  5, 根据所选转换器的中断标志位来判断转换完成了吗?
  6, 判断完成转换后就可以通过获取结果的相关函数,获取转换的结果了。
  7, 如果需要下次转换,记得清除中断标志。
  不同情况下有不同的应用,具体详见库函数包里的例程。共有6种用法。

使用特权

评论回复
6
xlhtracy|  楼主 | 2015-4-9 09:54 | 只看该作者
本帖最后由 xlhtracy 于 2015-4-9 11:09 编辑

第六章  FlashCtl-Flash存储控制器 6.1  本章引言
闪存模块有一个联合控制器,可以控制编程和擦除操作。可以写入单个比特、 字节或字到闪存,但是闪存可擦除的最小单位是块(段)。闪存被划分为主要和信息存储块。在操作主存储块和信息存储块时候是没有差别的。代码和数据可以位于每个块。请参阅特定于设备的数据工作表,来确定每个块的起止地址,同时,还有完整的设备内存映射。本库函数提供用于闪存块的擦、写及操作状态检测的API
本驱动程序包含在flashctl.c文件里,头文件在flashctl.h

6.2  函数总览
1
void FlashCtl_eraseSegment (uint8_t ∗flash_ptr)
擦除闪存的一个块(段)
2
void FlashCtl_performMassErase (uint8_t ∗flash_ptr)
擦除全部闪存
3
bool FlashCtl_performEraseCheck (uint8_t ∗flash_ptr, uint16_t numberOfBytes)
擦除闪存**体检查。
4
void FlashCtl_write8 (uint8_t ∗data ptr, uint8_t ∗flash_ptr, uint16_t count)
8位的字节单位写入闪存,通过引用传递(这里就是指针传递的意思)。
5
void FlashCtl_write16 (uint16_t ∗data ptr, uint16_t ∗flash_ptr, uint16_t count)
16位的字单位写入闪存,通过引用传递
6
void FlashCtl_write32 (uint32_t ∗data ptr, uint32_t ∗flash_ptr, uint16_t count)
32位的字单位写入闪存,通过引用传递
7
void FlashCtl_fillMemory32 (uint32_t value, uint32_t ∗flash_ptr, uint16_t count)
32位的字单位写入闪存,通过值传递。
8
uint8_t FlashCtl_getStatus (uint8_t mask)
检查 FlashCtl_status,看看是否擦除或编程的当前正忙。
9
void FlashCtl_lockInfo (void)
锁数据存储区部分。
10
void FlashCtl_unlockInfo (void)
解锁数据存储区部分。
11
uint8_t FlashCtl_setupClock (uint32_t clockTargetFreq, uint32_t clockSourceFreq, uint16_t clockSource)
设置闪存模块时钟。


    FlashCtl_segmentErase() 可以帮助清除单个块段的闪存。一个指向将要被擦除的闪存块段的指针传递给该函数。
   FlashCtl_performEraseCheck() 帮助检查在闪存中的特定数量的字节目前是否被擦除。指向擦除检查和要检查的字节数的起始位置的指针传递到此函数。
    根据即将被执行写入到闪存的类型,此库函数提供了Api用于闪存的写操作。
    FlashCtl_write8() 函数以字节为单位写入闪存。FlashCtl_write16() 函数以字为单位写入闪存。FlashCtl_write32() 以长整型为单位写入闪存,通过引用(指针)。FlashCtl_memoryFill32() 函数以长整型,通过传递值方式写入闪存。FlashCtl_getStatus() 检测是否闪存当前忙于擦写状态。FlashCtl_lockInfo() 锁信数据储区。FlashCtl unlockInfo() 解锁数据存储区。
    闪存API可以分为4:那些处理闪存擦除的,那些写闪存的,那些获取闪存状态的,还有那些锁/解锁数据存储区的。
    擦除操作的有:
     FlashCtl_segmentErase()
     FlashCtl_massErase()

    写闪存操作的有:
     FlashCtl_write8()
     FlashCtl_write16()
     FlashCtl_write32()
     FlashCtl_memoryFill32()

    获取状态的有:
     FlashCtl getStatus()
     FlashCtl performEraseCheck()

    数据信息存储区(块、段)锁/解锁操作的有:
     FlashCtl lockInfo()
     FlashCtl unlockInfo()

     闪存时钟设置的有: FlashCtl setupClock()

使用特权

评论回复
7
xlhtracy|  楼主 | 2015-4-9 09:54 | 只看该作者
本帖最后由 xlhtracy 于 2015-4-9 11:16 编辑

详解
void FlashCtl_eraseSegment (uint8_t  *flash_ptr)
  擦除单个闪存块段。
  对于像 MSP430i204x MCU,如果指定的部分是信息(数据)闪存段,调用此API之前必须调用FLASH_unlockInfo
参数
flash_ptr
指向即将被擦除的闪存块的指针
  返回:无。

void FlashCtl_performMassErase (uint8_t  *flash_ptr)
  擦除全部闪存。对于像 MSP430i204x MCU,如果FLASH_unlockInfo API是提前被执行过,此API将擦除主内存和信息内存。此外注意到擦除MSP430i204x信息闪存,会影响位于信息内存的 TLV 标定常数。
参数
flash_ptr
指向即将被擦除的闪存块的指针
  返回:无。

bool FlashCtl_performEraseCheck (uint8_t ∗flash_ptr, uint16_t numberOfBytes)
  该函数检测闪存中的字节,来确认他们是否被擦除了(即设置为了0xFF)。
参数
flash_ptr
指向即将被擦除的闪存块的开头区指针
numberOfBytes
将被检测的字节数量
  返回:SUCCESS 或 FALL

void FlashCtl_write8 (uint8_t ∗data ptr, uint8_t ∗flash_ptr, uint16_t count)
  此函数将count数量的字节数组写入到闪存。假定已经擦掉,且解锁了闪存。FlashCtl_eraseSegment 可以用来擦除一段。
参数
data_ptr
指向即将被写的数据的指针
flash_ptr
指向被写入数据的闪存地址
count
要写入的数量
  返回:空

void FlashCtl_write16 (uint16_t ∗data ptr, uint16_t ∗flash_ptr, uint16_t count)
  此函数将count数量的16-bits字数组写入到闪存。假定已经擦掉,且解锁了闪存。FlashCtl_eraseSegment 可以用来擦除一段。
  参数
data_ptr
指向即将被写的数据的指针
flash_ptr
指向被写入数据的闪存地址
count
要 写入的数量
  返回:空

void FlashCtl_write32 (uint32_t ∗data ptr, uint32_t ∗flash_ptr, uint16_t count)
  此函数将count数量的32-bits长整型数组写入到闪存。假定已经擦掉,且解锁了闪存。FlashCtl_eraseSegment 可以用来擦除一段。
  参数
data_ptr
指向即将被写的数据的指针
flash_ptr
指向被写入数据的闪存地址
count
要 写入的数量
  返回:空

void FlashCtl_fillMemory32 (uint32_t value, uint32_t ∗flash_ptr, uint16_t count)
  此函数将count次的32-bits长整型数据写入到闪存。假定已经擦掉,且解锁了闪存。FlashCtl_eraseSegment 可以用来擦除一段。
  参数
value
用于装填内存的值(该值可以用来填充内存空间)
flash_ptr
指向被写入数据的闪存地址
count
要 写入的数量
  返回:空

uint8_t FlashCtl_getStatus (uint8_t mask)
  此函数将检查状态寄存器,以确定是否已准备好写闪存。
  参数
mask
FLASHCTL 读取的状态掩码值是下面量值的逻辑或
LASHCTL READY FOR NEXT WRITE
FLASHCTL ACCESS VIOLATION INTERRUPT FLAG
FLASHCTL PASSWORD WRITTEN INCORRECTLY
FLASHCTL BUSY

  返回:下面量值的逻辑或
LASHCTL READY FOR NEXT WRITE
FLASHCTL ACCESS VIOLATION INTERRUPT FLAG
FLASHCTL PASSWORD WRITTEN INCORRECTLY
FLASHCTL BUSY
  指示FlashCtl的状态

void FlashCtl_lockInfo (void)
  该函数通常在其他 API 函数为了执行重新锁信息闪存区擦写操作后被调用。
  返回值:空

void FlashCtl_unlockInfo (void)
  该函数在被其他函数执行擦写操作信息闪存区之前调用。
  返回值:空

uint8_t FlashCtl_setupClock (uint32_t clockTargetFreq, uint32_t clockSourceFreq, uint16_t clockSource)
  这个函数用于设置flash模块时钟。任何其他闪存的 API 函数在调用之前,通常会调用此函数。
  参数
clockTargetFreq
目标时钟源频率 Hz
clockSourceFreq
时钟源频率Hz
clockSource
闪存的时钟源。可选值有:
FLASHCTL_MCLK   (默认)
FLASHCTL_SMCLK
  返回:时钟设置结果,指示时钟设置成功或失败。

使用特权

评论回复
8
xlhtracy|  楼主 | 2015-4-9 09:56 | 只看该作者
本帖最后由 xlhtracy 于 2015-4-15 10:43 编辑

6.3  例程
#include "driverlib.h"

// Address of the beginning of the Flash Information Segment
#define SEGSTART 0x1060
// Number of bytes within segment to write
#define SEG_LEN 16

// Value to write to segment
const uint32_t Value = 0xBEEFDEAD;

void write_InfoSeg(uint32_t value);

void main(void) {
    // Pointer to beginning of Flash segment
    uint32_t *flashPtr = (uint32_t *)SEGSTART;

    // Stop WDT
    WDT_hold(WDT_BASE);

    // Setting the DCO to use the internal resistor. DCO will be at 16.384MHz
    CS_setupDCO(CS_INTERNAL_RESISTOR);

    // Setting MCLK to DCO / 1. MCLK = 16.384MHz.
    CS_initClockSignal(CS_MCLK, CS_CLOCK_DIVIDER_1);

    // MCLK for Flash Timing Generator
    // Flash clock will run at ~390kHz. Datasheet recommends 257kHz - 476kHz
    FlashCtl_setupClock(390095, 16384000, FLASHCTL_MCLK);

    FlashCtl_unlockInfo();
    FlashCtl_fillMemory32(Value, flashPtr, SEG_LEN / 4);
    FlashCtl_lockInfo();

    while(1)
    {
        // Set breakpoint to view memory
        __no_operation();
    }
}


    例程摘自库函数包里的例程。由例程可以方便我们理解库函数应用教程。首先通过指针标记要被操作的闪存块地址,之后设置系统的时钟系统,例程选择使用内部电阻模式的DCO,且不分频。闪存时钟配置,可以看到三个参数的意义,第一个,闪存工作的频率,第二个,闪存引用的时钟源频率,第三个参数是闪存使用的时钟源。后面就要解锁数据存储区,之后写入数据,写完要记得再次锁数据存储区。

    你学会了吗?欢迎大家一起讨论学习本科的感想,以及疑问,在帖子后面提出。试着根据例程修改,尝试例程中其他没有提到的API用法

本章作业
1.        根据MSP430i2040手册,查找VCORE管脚相关信息,并查找资料给出该管脚的作用,以及在使用中如何配置。
2.        查找MSP430i2040手册,确定闪存部分的地址,以及结合例程距离如何从首地址写入16个0xF0 (字节)。

msp430i2040.pdf (1.23 MB)



使用特权

评论回复
9
xlhtracy|  楼主 | 2015-4-9 09:56 | 只看该作者
本帖最后由 xlhtracy 于 2015-4-15 10:44 编辑

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

使用特权

评论回复
10
songchenping| | 2015-4-9 09:58 | 只看该作者
本帖最后由 songchenping 于 2015-4-27 12:10 编辑

先占个楼,后续更新。
问题:param. groupEnable = SD24_NOT_GROUPED; // No grouped分组是什么意思,大家可以认真阅读相关资料,积极探讨。

分组的意思是可以将ADC某些通道进行分组,具体的就是一种ADC采集工作模式。对每一组的通道进行统一设置,可以是在同一组的通道进行统一采集转换,可以是单次,也可以是连续采集和转换。

具体见手册相关章节:





使用特权

评论回复
11
xlhtracy|  楼主 | 2015-4-9 10:08 | 只看该作者
songchenping 发表于 2015-4-9 09:58
先占个楼,后续更新。

太速度了。。

使用特权

评论回复
12
songchenping| | 2015-4-9 10:16 | 只看该作者

够专业吧?

使用特权

评论回复
13
hanzhenfei| | 2015-4-9 12:24 | 只看该作者
已经第三期了,前排留名,持续关注中

使用特权

评论回复
14
michael_llh| | 2015-4-9 12:31 | 只看该作者
有一二讲的PDF吗?

使用特权

评论回复
15
xlhtracy|  楼主 | 2015-4-9 13:43 | 只看该作者
michael_llh 发表于 2015-4-9 12:31
有一二讲的PDF吗?

第一、二讲的帖子里都附有pdf下载

使用特权

评论回复
16
michael_llh| | 2015-4-9 13:59 | 只看该作者
xlhtracy 发表于 2015-4-9 13:43
第一、二讲的帖子里都附有pdf下载

好的谢谢咯

使用特权

评论回复
17
必胜客A| | 2015-4-9 14:30 | 只看该作者
讲的不错,等我研究会SD24,这个不错,很好

使用特权

评论回复
18
必胜客A| | 2015-4-9 14:32 | 只看该作者
michael_llh 发表于 2015-4-9 12:31
有一二讲的PDF吗?

在一楼,链接里面有第一二讲,然后在每讲的最后有相关PDF下载

使用特权

评论回复
19
gaoyang9992006| | 2015-4-9 14:38 | 只看该作者
说明,那个是415=一个很大的数字是:4^15=……

使用特权

评论回复
20
lvyunhua| | 2015-4-9 14:47 | 只看该作者
占座学习中!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

52

主题

1448

帖子

25

粉丝