怎样批量修改XP系统数据库注册表删除数值数据(V)?

&&& &&& &&& &基于 STM32F4 MCU 的 TI 双模 Bluetooth(R) 协议栈
从德州仪器 (TI) 或第三方购买
当前版本 &
版本日期 &
CC256XEM-STADAPT:
CC256xEM Bluetooth(R) Adapter Kit
$19.99(USD)
价格可能会不同
29-JUN-2015&
CC2564MODNEM-STADAPT-BNDL:
Dual-mode Bluetooth(R) CC2564 module evaluation board +
CC256xEM Bluetooth(R) Adapter Kit
$39.98(USD)
CC256XSTBTBLESW:
TI Dual-mode Bluetooth(R) stack on STM32F4 MCUs
26-OCT-2015&
TI 出品的适用于蓝牙 + 蓝牙低功耗的 STM32F4 MCU 软件上的双模蓝牙堆栈可实现 STM32 ARM Cortex M4,且由用于实施蓝牙 4.0 规范的单模和双模产品所构成。该蓝牙堆栈已完全通过认证(QDID 37180 或 QDID 69887 以及 QDID 42849 或 QDID 69886),可提供简易命令行采样应用以加速开发,并可按需提供 MFI 功能。
为实现完整的评估解决方案,CC256XSTBTBLESW 可直接与硬件开发套件 STM3240G-EVAL 搭配使用。此外,适用于 STM32 MCU 的堆栈已通过认证且免专利费 (CC256XSTBTBLESW)。
该软件可与所有 CC256x EM 板(&和 )搭配使用,从而提供完整的蓝牙 BR/EDR/LE HCI 解决方案,进而减轻设计工作量并缩短上市时间。CC256x EM 板包含 TI 的第七代蓝牙核心,并提供符合蓝牙 4.1 标准且已通过产品验证的解决方案。上述器件可提供最佳射频性能,同时其发射功率和接收灵敏度较之其他仅 BLE 解决方案也超出了约 2 倍。此外,TI 的电源管理硬件和软件算法大大节省了所有广泛使用的蓝牙 BR/EDR/LE 运行模式的能耗。
支持双模蓝牙 4.0 - 获蓝牙认证且免版税
该蓝牙堆栈已完全通过以下标准的认证:
CC256XM4BTBLESW - QDID 37180 和 QDID 42849
CC256XMSPBTBLESW - QDID 37180 和 QDID 42849
CC256XSTBTBLESW - QDID 69887 和 QDID 69886
全线程安全性
支持线程化和非线程化环境
完整记录 API 接口
可与任意 STM32F4 MCU 搭配使用
借助 CC256XEM-STADAPT 支持,采样应用可供 STM3240G-EVAL MCU 开发套件使用
可选择启用/禁用协议/配置文件
支持 Keil 和 IAR IDE
提供经典配置文件
高级音频分配配置文件 (A2DP):A3DP 实施
音频/视频远程控制配置文件 (AVRCP)
设备 ID 配置文件 (DI)
文件传输配置文件 (FTP)
通用访问配置文件 (GAP)
通用音频/视频分配配置文件 (GAVDP)
耳机配置文件 (HSP)
免提配置文件 (HFP)
人机交互设备配置文件 (HID)
消息访问配置文件 (MAP)
对象推送配置文件 (OPP)
个人局域网配置文件 (PAN)
电话薄访问配置文件 (PBAP)
串行端口配置文件 (SPP)
提供蓝牙低功耗配置文件
警报通知服务 (ANS)
警报通知配置文件 (ANP)
电池服务 (BAS)
电流时间服务 (CTS)
器件信息服务 (DIS)
Find Me 配置文件 (FMP)
通用访问配置文件服务 (GAPS)
通用属性配置文件 (GATT)
医疗温度计服务 (HTS)
医疗温度计配置文件 (HTP)
心率服务 (HRS)
心率配置文件 (HRP)
人机交互设备服务 (HIDS)
HID over GATT 配置文件 (HOGP)
及时警报服务 (IAS)
链路断开服务 (LLS)
下个夏时制更改 (NDCS)
电话警报状态服务 (PASS)
电话警报状态配置文件 (PASP)
近距传感配置文件 (PXP)
基准时间更新服务 (RTUS)
扫描参数服务 (SCPS)
TX 功率服务 (TPS)
用户指南&(8)
*This is not an TI official document.
2015年 6月 16日
2017年 2月 28日
2015年 10月 1日
2015年 7月 24日
2015年 7月 8日
2015年 5月 21日
多种文件格式
2015年 5月 19日
2014年 8月 20日
白皮书&(2)
2014年 6月 27日
2014年 3月 25日
设计文件&(1)
下载最新英文版本
2015年 7月 1日
更多文献资料&(2)
2017年 3月 15日
2016年 2月 3日
用于 CC256xB 的蓝牙服务包&
CC256XB-BT-SP&
用于 WL18xx 的 TI Bluetooth Stack 附加包(Linux 平台)&
TI-BT-STACK-LINUX-ADDON&
基于 Stonestreet One Bluetopia 的 TI 蓝牙堆栈&
TIBLUETOOTHSTACK-SDK&
软件开发套件 (SDK)&
CC256x Bluetooth Hardware Evaluation Tool
(ZIP, 13473KB)
&&1185&次点击,
2013年 3月 15日(英文內容)
隐藏此内容
开发工具&(1)
CC256x 蓝牙硬件评估工具&
设计套件与评估模块&(2)
CC2564 Bluetooth(R) 双路模式模块评估版&
CC2564MODNEM&
评估模块和开发板&
CC256x Bluetooth(R)/双模评估模块&
CC256XQFNEM&
评估模块和开发板&
参考设计&(4)
CC256x Bluetooth(R) 参考设计&
CC256XEM-RD&
TI designs
蓝牙 和 MSP430 音频信宿参考设计&
BT-MSPAUDSINK-RD&
TI designs
蓝牙和 MSP430 音频源参考设计&
BT-MSPAUDSOURCE-RD&
TI designs
面向便携式化学分析应用的蓝牙连接型 DLP 超级移动 NIR 光谱仪&
TIDA-00554&
TI designs
隐藏此内容
TI 器件&(4)
蓝牙 Smart Ready 控制器&
配套无线解决方案&
蓝牙 Smart Ready 控制器&
双模蓝牙(BLE/BT)&
CC2564MODA&
CC2564MODx Bluetooth(R) 主机控制器接口 (HCI) 模块&
双模蓝牙(BLE/BT)&
CC2564MODN&
蓝牙双模式 HCI 模块&
双模蓝牙(BLE/BT)&
隐藏此内容
德州仪器在线技术支持社区 ()
作为my.TI的用户,您可以登陆向TI工程师寻求技术支持,并与业内同行交流或分享设计经验和心得。
由TI和其社区用户提供的内容仅符合当时状况,不视为TI的标准说明。请详见。stm32(19)
1.&&&&&&ADC简介
STM32F4xx系列一般都有3个ADC,这些ADC可以独立使用,也可以使用双重/三重模式(提高采样率)。STM32F4的ADC是12位逐次逼近型的模拟数字转换器。它有19个通道,可测量16个外部源、2个内部源和Vbat通道的信号。这些通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中。 模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阀值。
STM32F407VGT6包含有3个ADC。STM32F4的ADC最大的转换速率为2.4Mhz,也 就 是转换时间为0.41us(在ADCCLK=36M,采样周期为3个ADC时钟下得到),不要让ADC的时钟超过36M,否则将导致结果准确度下降
STM32F4将ADC的转换分为2个通道组:规则通道组和注入通道组。规则通道相当于你正常运行的程序,而注入通道呢,就相当于中断。在你程序正常执行的时候,中断是可以打断你的执行的。同这个类似,注入通道的转换可以打断规则通道的转换, 在注入通道被转换完成之后,规则通道才得以继续转换。
通过一个形象的例子可以说明:假如你在家里的院子内放了5个温度探头,室内放了3个温度探头;你需要时刻监视室外温度即可,但偶尔你想看看室内的温度;因此你可以使用规则通道组循环扫描室外的5个探头并显示AD转换结果,当你想看室内温度时,通过一个按钮启动注入转换组(3个室内探头)并暂时显示室内温度,当你放开这个按钮后,系统又会回到规则通道组继续检测室外温度。从系统设计上,测量并显示室内温度的过程中断了测量并显示室外温度的过程,但程序设计上可以在初始化阶段分别设置好不同的转换组,系统运行中不必再变更循环转换的配置,从而达到两个任务互不干扰和快速切换的结果。可以设想一下,如果没有规则组和注入组的划分,当你按下按钮后,需要从新配置AD循环扫描的通道,然后在释放按钮后需再次配置AD循环扫描的通道。上面的例子因为速度较慢,不能完全体现这样区分(规则通道组和注入通道组)的好处,但在工业应用领域中有很多检测和监视探头需要较快地处理,这样对AD转换的分组将简化事件处理的程序并提高事件处理的速度。
STM32F4其ADC的规则通道组最多包含16个转换,而注入通道组最多包含4个通道。
STM32F4的ADC在单次转换模式下,只执行一次转换,该模式可以通过ADC_CR2寄存器的ADON位(只适用于规则通道)启动,也可以通过外部触发启动(适用于规则通道和注入通道),这时CONT位为0。
以规则通道为例,一旦所选择的通道转换完成,转换结果将被存在ADC_DR寄存器中,EOC(转换结束)标志将被置位,如果设置了EOCIE,则会产生中断。然后ADC将停止,直到下次启动
接下来,我们介绍一下我们执行规则通道的单次转换,需要用到的ADC寄存器。第一个要介绍的是ADC控制寄存器(ADC_CR1和ADC_CR2)。ADC_CR1的各位描述如图所示:
ADC_CR1的SCAN位,该位用于设置扫描模式,由软件设置和清除,如果设置为1,则使用扫描模式,如果为0,则关闭扫描模式。在扫描模式下,由ADC_SQRx或ADC_JSQRx寄存器选中的通道被转换。如果设置了EOCIE或JEOCIE,只在最后一个通道转换完毕后才会产生EOC或JEOC中断。
ADC_CR1[25:24]用于设置ADC的分辨率,详细的对应关系如图所示
本章我们使用12位分辨率,所以设置这两个位为0就可以了。接着我们介绍ADC_CR2,该寄存器的各位描述如图所示:
该寄存器我们也只针对性的介绍一些位:ADON位用于开关AD转换器。而CONT位用于设置是否进行连续转换,我们使用单次转换,所以CONT位必须为0。ALIGN用于设置数据对齐,我们使用右对齐,该位设置为0。
EXTEN[1:0]用于规则通道的外部触发使能设置,详细的设置关系如图所示
我们这里使用的是软件触发,即不使用外部触发,所以设置这2个位为0即可。ADC_CR2的SWSTART位用于开始规则通道的转换,我们每次转换(单次转换模式下)都需要向该位写1。
第二个要介绍的是ADC通用控制寄存器(ADC_CCR),该寄存器各位描述如图所示:
该寄存器我们也只针对性的介绍一些位:TSVREFE位是内部温度传感器和Vrefint通道使能位,内部温度传感器我们将在下一章介绍,这里我们直接设置为0。ADCPRE[1:0]用于设置ADC输入时钟分频,00~11分别对应2/4/6/8分频,STM32F4的ADC最大工作频率是36Mhz,而ADC时 钟(ADCCLK)来 自APB2,APB2频率一般是84Mhz,所以我们一般设置ADCPRE=01,即4分频,这样得到ADCCLK频率为21Mhz。MULTI[4:0]用于多重ADC模式选择,详细的设置关系如图所示:
本章我们仅用了ADC1(独立模式),并没用到多重ADC模式,所以设置这5个位为0即可
第三个要介绍的是ADC采样时间寄存器(ADC_SMPR1和ADC_SMPR2),这两个寄存器用于设置通道0~18的采样时间,每个通道占用3个位。ADC_SMPR1的各位描述如图所示:
对于每个要转换的通道,采样时间建议尽量长一点,以获得较高的准确度,但是这样会降低ADC的转换速率。ADC的转换时间可以由以下公式计算:
Tcovn=采样时间+12个周期
其中:Tcovn为总转换时间,采样时间是根据每个通道的SMP位的设置来决定的。例如,当ADCCLK=21Mhz的时候,并设置3个周期的采样时间,则得到:Tcovn=3+12=15个周期=0.71us。
第四个要介绍的是ADC规则序列寄存器(ADC_SQR1~3),该寄存器总共有3个,这几个寄存器的功能都差不多,这里我们仅介绍一下ADC_SQR1,该寄存器的各位描述如图所示:
L[3:0]用于存储规则序列的长度,我们这里只用了1个,所以设置这几个位的值为0。其他的SQ13~16则存储了规则序列中第13~16个通道的编号(0~18)。另外两个规则序列寄存器同ADC_SQR1大同小异,我们这里就不再介绍了,要说明一点的是:我们选择的是单次转换,所以只有一个通道在规则序列里面,这个序列就是SQ1,至于SQ1里面哪个通道,完全由用户自己设置,通过ADC_SQR3的最低5位(也就是SQ1)设置。
第五个要介绍的是ADC规则数据寄存器(ADC_DR)。规则序列中的AD转化结果都将被存在这个寄存器里面,而注入通道的转换结果被保存在ADC_JDRx里面。ADC_DR的各位描述如图:
这里要提醒一点的是,该寄存器的数据可以通过ADC_CR2的ALIGN位设置左对齐还是右对齐。在读取数据的时候要注意。
最后一个要介绍的ADC寄存器为ADC状态寄存器(ADC_SR),该寄存器保存了ADC转换时的各种状态。该寄存器的各位描述如图所示:
这里我们仅介绍将要用到的是EOC位,我们通过判断该位来决定是否此次规则通道的AD转换已经完成,如果该位位1,则表示转换完成了,就可以从ADC_DR中读取转换结果,否则等待转换完成。
2.&&&&&&ADC库函数应用步骤
使用到的库函数分布在stm32f4xx_adc.c文件和stm32f4xx_adc.h文
件中。下面讲解其详细设置步骤
STM32F407ZGT6的ADC1通道5在PA5上,所以,我们先要使能GPIOA的时钟,然后设置PA5为模拟输入。同时我们要把PA5复用为ADC,所以我们要使能ADC1时钟。这里特别要提醒,对于IO口复用为ADC我们要设置模式为模拟输入,而不是复用功能,也不需要调用GPIO_PinAFConfig函数来设置引脚映射关系。
使能GPIOA时钟和ADC1时钟都很简单,具体方法为:
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);//使能GPIOA时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE); //使能ADC1时钟
初始化GPIOA5为模拟输入,方法也多次讲解,关键代码为:
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AN;//模拟输入
这里需要说明一下,ADC的通道与引脚的对应关系在STM32F4的数据手册可以查到,我们这里使用ADC1的通道5,在数据手册中的表格为:
这里我们把ADC1~ADC3的引脚与通道对应关系列出来, 16个外部源的对应关系如下表:
2)设置ADC的通用控制寄存器CCR,配置ADC输入时钟分频,模式为独立模式等。
在库函数中,初始化CCR寄存器是通过调用ADC_CommonInit来实现的:
void ADC_CommonInit(ADC_CommonInitTypeDef*ADC_CommonInitStruct)
这里我们不再李处初始化结构体成员变量,而是直接看实例。初始化实例为:
ADC_CommonInitStructure.ADC_Mode =ADC_Mode_I//独立模式
ADC_CommonInitStructure.ADC_TwoSamplingDelay= ADC_TwoSamplingDelay_5C
ADC_CommonInitStructure.ADC_DMAAccessMode =ADC_DMAAccessMode_D
ADC_CommonInitStructure.ADC_Prescaler =ADC_Prescaler_Div4;
ADC_CommonInit(&ADC_CommonInitStructure);//初始化
第一个参数ADC_Mode用来设置是独立模式还是多重模式,这里我们选择独立模式。
第二个参数ADC_TwoSamplingDelay用来设置两个采样阶段之间的延迟周期数。这个比较好理解。取值范围为:ADC_TwoSamplingDelay_5Cycles~ADC_TwoSamplingDelay_20Cycles。
第三个参数ADC_DMAAccessMode是DMA模式禁止或者使能相应DMA模式。
第四个参数ADC_Prescaler用来设置ADC预分频器。这个参数非常重要,这里我们设置分频系数为4分频ADC_Prescaler_Div4,保证ADC1的时钟频率不超过36MHz。
3)初始化ADC1参数,设置ADC1的转换分辨率,转换方式,对齐方式,以及规则序列等相关信息。
在设置完分通用控制参数之后,我们就可以开始ADC1的相关参数配置了,设置单次转换模式、触发方式选择、数据对齐方式等都在这一步实现。具体的使用函数为:
void ADC_Init(ADC_TypeDef* ADCx,ADC_InitTypeDef* ADC_InitStruct)
初始化实例为:
ADC_InitStructure.ADC_Resolution =ADC_Resolution_12b;//12位模式
ADC_InitStructure.ADC_ScanConvMode =DISABLE;//非扫描模式
ADC_InitStructure.ADC_ContinuousConvMode =DISABLE;//关闭连续转换
ADC_InitStructure.ADC_ExternalTrigConvEdge= ADC_ExternalTrigConvEdge_N
//禁止触发检测,使用软件触发
ADC_InitStructure.ADC_DataAlign =ADC_DataAlign_R//右对齐
ADC_InitStructure.ADC_NbrOfConversion =1;//1个转换在规则序列中
ADC_Init(ADC1,&ADC_InitStructure);//ADC初始化
第一个参数ADC_Resolution用来设置ADC转换分辨率。取值范围为:ADC_Resolution_6b,
ADC_Resolution_8b,ADC_Resolution_10b和ADC_Resolution_12b。
第二个参数ADC_ScanConvMode用来设置是否打开扫描模式。这里我们设置单次转换所以不打开扫描模式,值为DISABLE。
第三个参数ADC_ContinuousConvMode用来设置是单次转换模式还是连续转换模式,这里我们是单次,所以关闭连续转换模式,值为DISABLE。
第三个参数ADC_ExternalTrigConvEdge用来设置外部通道的触发使能和检测方式。这里我们直接禁止触发检测,使用软件触发。还可以设置为上升沿触发检测,下降沿触发检测以及上升沿和下降沿都触发检测。
第四个参数ADC_DataAlign 用来设置数据对齐方式。取值范围为右对齐
ADC_DataAlign_Right和左对齐ADC_DataAlign_Left。
第五个参数ADC_NbrOfConversion用来设置规则序列的长度,这里我们是单次转换,所以值为1即可。
实际上还有个参数ADC_ExternalTrigConv是用来为规则组选择外部事件。因为我们前面配置的是软件触发,所以这里我们可以不用配置。如果选择其他触发方式方式,这里需要配置。
4)开启AD转换器。
在设置完了以上信息后,我们就开启AD转换器了(通过ADC_CR2寄存器控制)。
ADC_Cmd(ADC1, ENABLE);//开启AD转换器
5)读取ADC值。
在上面的步骤完成后,ADC就算准备好了。接下来我们要做的就是设置规则序列1里面的通道,然后启动ADC转换。在转换结束后,读取转换结果值值就是了。
这里设置规则序列通道以及采样周期的函数是:
void ADC_RegularChannelConfig(ADC_TypeDef*ADCx, uint8_t ADC_Channel,
uint8_t Rank, uint8_t ADC_SampleTime);
我们这里是规则序列中的第1个转换,同时采样周期为480,所以设置为:
ADC_RegularChannelConfig(ADC1,ADC_Channel_5, 1, ADC_SampleTime_480Cycles );
软件开启ADC转换的方法是:
ADC_SoftwareStartConvCmd(ADC1);//使能指定的ADC1的软件转换启动功能
开启转换之后,就可以获取转换ADC转换结果数据,方法是:
ADC_GetConversionValue(ADC1);
同时在AD转换中,我们还要根据状态寄存器的标志位来获取AD转换的各个状态信息。库函数获取AD转换的状态信息的函数是:
FlagStatus ADC_GetFlagStatus(ADC_TypeDef*ADCx, uint8_t ADC_FLAG)
比如我们要判断ADC1的转换是否结束,方法是:
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));//等待转换结束
这里还需要说明一下ADC的参考电压,探索者STM32F4开发板使用的是STM32F407ZGT6,该芯片只有Vref+参考电压引脚,Vref+的输入范围为:1.8~VDDA。探索者STM32F4开发板通过P7端口,来设置Vref+的参考电压,默认的我们是通过跳线帽将ref+接到VDDA,参考电压就是3.3V。如果大家想自己设置其他参考电压,将你的参考电压接在Vref+上就OK了(注意要共地)。另外,对于还有Vref-引脚的STM32F4芯片,直接就近将Vref-接VSSA就可以了。
本章我们的参考电压设置的是3.3V。
通过以上几个步骤的设置,我们就能正常的使用STM32F4的ADC1来执行AD转换操作了。
3.&&&&&&ADC实例
实现采集3.3V电压和GND电压,用串口打印出来
#ifndef _ADC_H_H_H
#define _ADC_H_H_H
#include &stm32f4xx_gpio.h&
#include &stm32f4xx_rcc.h&
#include &stm32f4xx_adc.h&
void Adc_Init(void);
//ADC通道初始化
u16 Get_Adc(u8 ch);
//获得某个通道值
u16 Get_Adc_Average(u8 ch,u8 times);//得到某个通道给定次数采样的平均值
#include &adc.h&
#include &delay.h&
//初始化ADC
void Adc_Init(void)
GPIO_InitTypeDef GPIO_InitS
ADC_CommonInitTypeDef ADC_CommonInitS
ADC_InitTypeDef
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能GPIOA时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //使能ADC1时钟
//先初始化ADC1通道5 IO口
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//PA5 通道5
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;//模拟输入
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;//不带上下拉
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化
RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE);
//ADC1复位
RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,DISABLE);
//复位结束
ADC_CommonInitStructure.ADC_Mode = ADC_Mode_I//独立模式
ADC_CommonInitStructure.ADC_TwoSamplingDelay =ADC_TwoSamplingDelay_5C//两个采样阶段之间的延迟5个时钟
ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_D//DMA失能
ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;//预分频4分频。ADCCLK=PCLK2/4=84/4=21Mhz,ADC时钟最好不要超过36Mhz
ADC_CommonInit(&ADC_CommonInitStructure);//初始化
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;//12位模式
ADC_InitStructure.ADC_ScanConvMode = DISABLE;//非扫描模式
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//关闭连续转换
ADC_InitStructure.ADC_ExternalTrigConvEdge =ADC_ExternalTrigConvEdge_N//禁止触发检测,使用软件触发
ADC_InitStructure.ADC_DataAlign= ADC_DataAlign_R//右对齐
ADC_InitStructure.ADC_NbrOfConversion = 1;//1个转换在规则序列中 也就是只转换规则序列1
ADC_Init(ADC1, &ADC_InitStructure);//ADC初始化
ADC_Cmd(ADC1, ENABLE);//开启AD转换器
//获得ADC值
//ch: @ref ADC_channels
//通道值 0~16取值范围为:ADC_Channel_0~ADC_Channel_16
//返回值:转换结果
u16 Get_Adc(u8 ch)
ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_480Cycles );
//ADC1,ADC通道,480个周期,提高采样时间可以提高精确度
ADC_SoftwareStartConv(ADC1);
//使能指定的ADC1的软件转换启动功能
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束
return ADC_GetConversionValue(ADC1);
//返回最近一次ADC1规则组的转换结果
u16 Get_Adc_Average(u8 ch,u8 times)
u32temp_val=0;
for(t=0;t&t++)
temp_val+=Get_Adc(ch);
delay_ms(5);
returntemp_val/
#include &led.h&
#include &key.h&
#include &delay.h&
#include &uart.h&
#include &exit.h&
#include &iwdog.h&
#include &pwm.h&
void User_Delay(__IO uint32_t nCount)
while(nCount--)
static int count = 0;
int main(void)
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
My_USART2_Init();
delay_init(168);
printf(&main test start\n&);
Adc_Init();
adcx=Get_Adc_Average(ADC_Channel_5,20);
temp=(float)adcx*(3.3/4096);
printf(&adc value:(%d) \n&,adcx);
delay_ms(250);
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:164302次
积分:3311
积分:3311
排名:第9513名
原创:127篇
转载:103篇
评论:23条
文章:12篇
阅读:2726
文章:38篇
阅读:81983
(11)(30)(1)(2)(1)(2)(2)(8)(28)(39)(22)(6)(31)(16)(18)(15)您还可以使用以下方式登录
当前位置:&>&&>& > uClinux下显示驱动移植及minigui的移植(转载)
stm32f4 移植uclinux uClinux下显示驱动移植及minigui的移植(转载)
首页 站内导航 帮助 欢迎您登录 |注册登录站点用户名密码 wacoo的日志wacoo的主页 >> TA的所有日志 >> 查看日志<< 返回上一页bcef记住我 注册
登录 uClinux下显示驱动移植及minigui的移植(转载) 已有 2008 次阅读
20:21天气: 晴朗心情: 高兴这几天包括今天都非常的不顺,写这些字的时候, 我的本本正在进行Linux ext3分区的建立,我的Fedola3彻底崩溃了,我的很多uClinux移植成果不见了,包括最看重的LCD显示的移植内容,这些都需要重新建立了,很多过程已很模糊,这也映证了我在LINUX上面的许多迷惑,学透它真的很难,内核的移植面临很多的难点,在我即将实施的项目上(手持终端),需要对LCD显示,触摸屏,网络等等进行移植,我的硬件是ARM7(s3c44b0x)采用uClinux为操作系统,GUI采用飞漫的MINIGUI。一切都刚开始。如果安装一切顺利的话, 我将把我移植的全过程完整记录下来,为自己留下一些心得以便于长期之后仍然记得当时的情形, 脑子记东西是不行了,可能是年纪大了的原因。在昨天下午的安装Fedora3的过程很不顺利,屡次失败,今天上班后又失败几次,后来分析是与ISO所在的D区(FAT32)磁盘有问题,用软件检查,发现D区有问题,C区正常,于是将ISO拷贝到C区(FAT32),从REDHAT9的ISO第一张上提取了DOSUTILS目录,将其拷贝进C区根目录,用Fedora3中的第一个ISO中的ISOLINUX目录下的这两个文件拷贝到DOSUTILS\AUTOBOOT下,用DOS重新启动机器,在提示符下键入:C:\&CD DOSUTILSC:\&AUTOBOOT开始安装Fedora3,中间过程正常,经过很长时间安装完成后,重新启动,默认启动采用X WINDOW启动,由于占用大量内存,我又习惯在文本状态下运行, 于是启动完成后,修改/etc/inittab,把id:4:initdefault 改为 id:3: initdefaul保存后重启。Linux工作在文本模式下。在另台PC上用CUTEFTP软件与LINUX主机建立FTP连接方式,将准备好的arm-elf-tools-.sh和uClinux -dist-.tar.gz及uClinux.tar.bz2上载到LINUX主机的/home目录,修改arm- elf-tools-.sh的属性为可执行,在提示符下键入tar zxvf uClinux-dist-.tar.gz将原版uClinux解压到/home目录下再在home目录下键入tar jxvf uClinux.tar.bz2将uClinux解压到/home目录下,覆盖原uClinux-dist目录,然后键入sh arm-elf-tools-.sh将uClinux工具链解压到系统中。做到这一步,就已经在LINUX下建立了uClinux开发环境。我们采用SecureCRT4.1软件在Windows主机登陆LINUX主机,当然我是以SUPERVISOR身份登陆的。经过这几步我基本建立了 uClinux的比较实用的交叉编译环境。下面就是针对我的应用平台来做移植了, 当然这个过程将极其艰苦。补充一点, 通过CUTEFTP上载arm-elf-tools-.sh会造成文件格式损坏, 将其后缀改变后上载,一切正常。
这一版的uClinux是来自勤研科技的配套S3C44B0X豪华板的改造过的内核。是基于uClinux2.4.x的改造。已经移植了串口,网络,YAFFS文件系统。但并没有基于Framebuffer的移植。更没有IIS、TOUCH SCREEN、USB、外部接口的移植。 为了移植Framebuffer驱动将宇立泰的补钉文件uClinux-.patch上载到Linux主机上的 /home/uClinux-dist目录下,键入patch –p1&uClinux-.patch对uClinux打补钉。这个补钉基于宇立泰开发板的Framebuffer驱动移植。我们可以修改它的相关文件来适应我的开发板。我们现在开始Framebuffer的移植,进入uClinux-dist目录,打开kernel_44b0.cfg文件,在SYSTEM TYPE大项中增加CONFIG_SPU_NAME="S3C44B0X"
CONFIG_CPU_S3C44B0X=y。在config.in文件中增加fiif [ "$CONFIG_DEFAULTS_SAMSUNG" = "y" ]; thenchoice 'Samsung Products' "44B0X CONFIG_DEFAULTS_SAMSUNG_44B0X \4510B CONFIG_DEFAULTS_SAMSUNG_4510B \" 44B0X在/home/uClinux-dist/vendors/Samsung/44B0X/config.linux-2.4.x中增加CONFIG_ARCH_S3C44B0=y在/home/uClinux-dist/linux-2.4.x/drivers/video/Config.in中增加if [ "$CONFIG_ARCH_S3C44B0" = "y" ]; thentristate '
Samsung S3C44B0X built-in LCD controller frame buffer support' CONFIG_FB_S3C44B0Xfi在/home/uClinux-dist/linux-2.4.x/drivers/video/目录下的Makefile文件中增加obj-$(CONFIG_FB_S3C44B0X)
+= s3c44b0xfb.o在/home/uClinux-dist/linux-2.4.x/drivers/video/fbmem.c中增加extern int s3c44b0xfb_init(void);extern int s3c44b0xfb_setup(char*); #ifdef CONFIG_FB_S3C44B0X{ "s3c44b0xfb", s3c44b0xfb_init, s3c44b0xfb_setup },#endif 修改/home/uClinux-dist/linux-2.4.x/include/asm/arch中的hardware.h文件以适应自己的板子。这些做完后,我们修改/home/uClinux-dist/linux-2.4.x/drivers/video/s3c44b0x.c,这个程序是实现FrameBuffer驱动的关键, 修改与LCD硬件有关的代码。完成后利用make menuconfig命令,完成需要裁减的内核配置,运行build_first.sh和build_final.sh在images目录下生成image.rom image.ram.将image.rom拷贝到WINDOWS主机,启动开发板,输入appprog ,打开windows命令行状态,输入tftp –I 192.168.111.8 put image.rom, 将内核烧入开发板内, 运行RUN。今天的最大的收获就是显示移植驱动做好了, 经过总结,显示的驱动和以下几个文件关系最大/home/uClinux-dist/linux-2.4.x/include/asm/arch/hardware.h/home/uClinux-dist/linux-2.4.x/include/asm/keyboard..h/home/uClinux-dist/linux-2.4.x/drivers/video/s3c44b0x.h/home/uClinux-dist/linux-2.4.x/drivers/video/fbmem.h/home/uClinux-dist/linux-2.4.x/drivers/video/makefile/home/uClinux-dist/vendors/Samsung/44b0x/makefile交叉编译应用程序应加-elf2flt参数。例如:arm-elf-gcc –o a a.c –elf2flt为了测试Framebuffer驱动是否正常, 将编译过的内核烧入开发板,运行起来, 在串口控制台上输入/bin/cp t240.bin /dev/fb0. 在LCD显示出256色的240X320图片。又编制了一个在240X320LCD上显示图片的程序(linuxdisp),程序代码如下 #include&linux/fb.h&#include&unistd.h&#include&sys/mman.h&#include&sys/types.h&#include&sys/stat.h&#include&fcntl.h&unsigned char abc[76800] = {…..略}int main() {int framebuffer_int line_size,buffer_size,char *screen_//unsigned char buffer[480000],j=0;struct fb_var_screeninfo var_struct fb_fix_screeninfo fix_framebuffer_device = open ( "/dev/fb0" , O_RDWR);ioctl (framebuffer_device, FBIOGET_VSCREENINFO, &var_info);ioctl (framebuffer_device, FBIOGET_FSCREENINFO, &fix_info);line_size = var_info.xres * var_info.bits_per_pixel / 8;buffer_size = line_size * var_info.var_info.xoffset = 0;var_info.yoffset = 0;//ioctl (framebuffer_device, FBIOPAN_DISPLAY,&var_info) == -1);//write(framebuffer_device,buffer,sizeof(buffer_size));screen_memory = (char *) mmap (0, buffer_size, PROT_READ | PROT_WRITE, 0, framebuffer_device, 0);
for (i=0;i & buffer_ i++ ){*(screen_memory+i) =abc[i];}sleep(2);return 0;}将这个软件放在/home/uClinux-dist/user/myapp下, 制作makefile。如下CC=arm-elf-gccEXEC = linuxdispoBJS = linuxdisp.c#LDFLAGS=-L/home/uClinux-dist/uClibc/liball: $(EXEC) $(EXEC): $(OBJS)$(CC) $(LDFLAGS) -o $@ $(OBJS) $(LDLIBS)-elf2flt romfs:$(ROMFSINST) /bin/$(EXEC) clean:-rm -f $(EXEC) *.elf *.gdb *.o执行make,编译成功。将执行文件linuxdisp拷贝进/home/romfs/bin下,重新编译内核烧入开发板,执行/bin/linuxdisp.程序正常运行。在LCD上正常显示图片。经过这几步测试可以说Framebuffer驱动的移植成功了。下一步将进行MINIGUI的移植。 MINIGUI的移植现在正式开始了。它的显示结果将影响我对它的信心。1.
安装资源文件:tar zxvf minigui-res-1.3.0.tar该命令将建立minigui-res-1.3.0目录。Cd minigui-res-1.3.0Make install2.
配置和编译minigui:tar zxvf libminigui-1.3.3.tar.gz,该命令将建立libminigui-1.3.3目录。Cd libminigui-1.3.3./configuremakemake install修改/etc/ ld.so.conf在最后添加/usr/local/libldconfig3.
编译并运行MINIGUI演示程序:tar zxvf mde-1.3.0.tar.gztar zxvf mg-samples-1.3.0.tar.gzcd mde-1.3.0./configuremake修改/usr/local/etc/ MiniGUI.cfg 将mdev=/dev/mouse改为mdev=/dev/mouse0保存退出。(FC3的缘故)。在PC上成功演示 为了调试应用程序方便, 先做一下NFS的先期准备。先修改/etc/exports,假如要增加/uclinux目录为与其他主机共享的目录。增加一条: /uclinux 192.168.111.x(rw,sync),
关闭放火墙。/etc/rc.d/init.d/portmap start/etc/rc.d/init.d/./nfs startexportfs –a检查是否已经启动NFS服务。 Mount 192.168.111.11:/uclinux /mnt配置uclinux时,配置内核
进入[file system]选项[*] nfs file system support[*] provide nfsv3 client support配置用户选项
进入network applications[*] portmap进入busybox选项[*] mount[*] mount: support nfs mounts内核编译。启动uclinuxportmap &mount –t nfs –o rsize=1024,wsize=1024,timeo=3,udp 192.168.111.11:/uclinux /mnt/yaffs/sample 进入/mnt/yaffs/sample, 就能看见主机上uclinux下的文件,执行其中的执行文件,一切OK。 这几天最大的收获是MINIGUI移植到开发板上的成功,令我非常振奋。移植针对的版本是minigui1.3.3。这个版本是目前飞漫开源最彻底的版本了。我的开发板上的显示器采用的是256色LCD,我针对我的开发板的条件,编写了相应的运行脚本:domain.sh #!/bin/shrm config.cache config.status -fCC=arm-elf-gcc \CFLAGS="-I/home/uClinux-dist/uClibc/include -Dlinux -D__linux__ -D__uClinux__ -Dunix " \LDFLAGS="-Wl,-elf2flt -static -Wl,-move-rodata -Wl,-L/home/uClinux-dist/lib/uClibc/lib -Wl,-L/home/uClinux-dist/linux-2.4.x/lib -Wl,-lc -Wl,-lm" \./configure --prefix=/usr/local/ \--prefix=/usr/local/arm-elf \--build=i386-pc-linux-gnu \--host=arm-elf-linux \--target=arm-elf-linux \--disable-shared \--disable-lite \--disable-standalone \--enable-incoreres \--disable-flatstyle \--enable-newgal \--disable-nativegal \--disable-galcommlcd \--enable-galfbcon \--enable-adsial \--disable-micemoveable \--disable-cursor \--disable-fblin1r \--enable-fblin8 \--disable-fblin16 \--disable-fblin32 \--disable-textmode \--enable-dummyial \--disable-mc68x328ial \--disable-nativeial \--disable-qvfbial \--disable-qpfsupport \--disable-ttfsupport \--disable-type1support \--disable-latin9support \--disable-gbksupport \--disable-big5support \--disable-unicodesupport \--disable-savebitmap \--disable-imegb2312 \--disable-imegb2312py \--disable-aboutdlg \--disable-savescreen \--disable-grayscreen \--enable-tinyscreen \--enable-video-fbcon \--disable-video-qvfb \--disable-nativegalqvfb \--with-osname=uclinux运行该脚本, 然后make, make install, ldconfig。先编译例子中最简单的helloworld.c下到板中运行,提示错误 /bin& helloworldNo available video device.NEWGAL: Does not find matched engine: qvfb.GDI: Can not get graphics engine information!InitGUI failure when using incore resource.pid 30: failed 256经过跟踪,进入sysres/mgedt.c#include "common.h" typedef struct _ETCSECTION{int key_
/* key number in the section */char *
/* name of the section */char **
/* key string arrays */char **
/* value string arrays */} ETCSECTION;typedef ETCSECTION* PETCSECTION; typedef struct _ETC_S{int section_
/* number of sections */PETCSECTION
/* pointer to section arrays */} ETC_S; #ifdef _INCORE_RES static char *SYSTEM_KEYS[] = {"gal_engine", "ial_engine", "mdev", "mtype"}; #ifdef __ECOSstatic char *SYSTEM_VALUES[] = {"ecoslcd", "ipaq", "/dev/ts", "none"};#else//static char *SYSTEM_VALUES[] = {"qvfb", "qvfb", "/dev/ts", "none"};
//这是我注释掉的原来的, 你们看看程序结构,不管我怎么配置NEWGAL,//这里都将不可避免的进入QVFBstatic char *SYSTEM_VALUES[] = {"fbcon", "dummy", "none", "none"};
//我新加的。#endif static char *FBCON_KEYS[] = {"defaultmode"};static char *FBCON_VALUES[] = {"240x320-8bpp"};
//原来的是240X320-16bpp static char *QVFB_KEYS[] = {"defaultmode", "display"};static char *QVFB_VALUES[] = {"640x480-16bpp", "0"}; static char *SYSTEMFONT_KEYS[] ={"font_number", "font0", "font1", "font2", "default", "wchar_def", "fixed", "caption", "menu", "control"};static char *SYSTEMFONT_VALUES[] ={"3","rbf-fixed-rrncnn-6-12-ISO8859-1", "*-fixed-rrncnn-*-12-GB2312", "*-SansSerif-rrncnn-*-12-GB2312",
"0", "1", "1", "1", "1", "1"}; static char *CURSORINFO_KEYS[] = {"cursornumber"};static char *CURSORINFO_VALUES[] = {"2"}; static char *ICONINFO_KEYS[] = {"iconnumber"};static char *ICONINFO_VALUES[] = {"5"}; static char *BITMAPINFO_KEYS[] = {"bitmapnumber"};static char *BITMAPINFO_VALUES[] = {"3"}; /*static char *BGPICTURE_KEYS[] = {"position"};static char *BGPICTURE_VALUES[] = {"center"}; static char *MOUSE_KEYS[] = {"dblclicktime"};static char *MOUSE_VALUES[] = {"300"}; static char *EVENT_KEYS[] = {"timeoutusec", "repeatusec"};static char *EVENT_VALUES[] = {"300000", "50000"};*/ static ETCSECTION mgetc_sections [] ={{4, "system",
SYSTEM_KEYS,
SYSTEM_VALUES},{1, "fbcon",
FBCON_KEYS,
FBCON_VALUES},{2, "qvfb",
QVFB_KEYS,
QVFB_VALUES},{10,"systemfont",
SYSTEMFONT_KEYS, SYSTEMFONT_VALUES},{1, "cursorinfo",
CURSORINFO_KEYS, CURSORINFO_VALUES},{1, "iconinfo",
ICONINFO_KEYS,
ICONINFO_VALUES},{1, "bitmapinfo",
BITMAPINFO_KEYS, BITMAPINFO_VALUES},/* optional sections *//*{1, "bgpicture", BGPICTURE_KEYS, BGPICTURE_VALUES},{1, "mouse", MOUSE_KEYS, MOUSE_VALUES},{2, "event", EVENT_KEYS, EVENT_VALUES},*/}; ETC_S MGETC = { 7, mgetc_sections }; #endif /* _INCORE_RES */修改后编译并运行。仍然提示错误。/bin& helloworldMAP_SHARED not supported (cannot write mappings to disk)
//这条一看就知道在MMAP使用了不适合uClibc库的参数, 此项应该设置为0NEWGAL: Does not find matched engine: fbcon.
GDI: Can not get graphics engine information!InitGUI failure when using incore resource.Unable to memory map the video hardwarepid 30: failed 256后来经过跟踪。在/libminigui-1.3.3/src/newgal/fbcon/fbvideo中找到OPEN及MMAP引用。将mapped_mem = mmap(NULL, mapped_memlen,PROT_READ|PROT_WRITE, MAP_SHARED, console_fd, 0);改为#ifdef __uClinux__mapped_mem = mmap(NULL, mapped_memlen,PROT_READ|PROT_WRITE, 0, console_fd, 0);
#elsemapped_mem = mmap(NULL, mapped_memlen,PROT_READ|PROT_WRITE, MAP_SHARED, console_fd, 0);
#endif将mapped_io = mmap(NULL, mapped_iolen, PROT_READ|PROT_WRITE,
MAP_SHARED, console_fd, mapped_memlen); 改为#ifdef __uClinux__mapped_io = mmap(NULL, mapped_iolen, PROT_READ|PROT_WRITE,
0, console_fd, mapped_memlen); #elsemapped_io = mmap(NULL, mapped_iolen, PROT_READ|PROT_WRITE,MAP_SHARED, console_fd, mapped_memlen); #endif编译后运行。发现出现代码崩溃,/bin/helloworldUnhandled fault: external abort on linefetch (F4) at 0x fault-common.c(97): start_code=0xcd00040, start_stack=0xcdfff84) pid 32: failed 7经过艰苦的跟踪分析。在/home/libminigui-1.3.3/src/kernel/desktop.c中。将if (!InitSystemRes ()) {fprintf (stderr, "DESKTOP: Can not initialize system resource!\n");
return FALSE; }注释掉。编译运行。 显示OK, 有跑了几个例子都正常。那个时刻真的很高兴。 从今天起将做触摸屏的移植, 这是很重要的移植步骤,将使我们的程序真正意义的运行起来。在/home/uClinux-dist/linux-2.4.x/drivers/char找到mc68328digi.c将起改名为 s3c44b0xts.c,将/home/uClinux-dist/linux-2.4.x/include/linux下的 mc68328digi.h改为s3c44b0xts.h。 先做好内核配置准备:在/home/uClinux-dist/linux-2.4.x/drivers/char/config.in中增加 if [ "$CONFIG_ARCH_S3C44B0" = "y" ]; thenbool 'S3C44B0 TOUCH SCREEN SUPPORT' CONFIG_TS_S3C44B0 fi在/home/uClinux-dist/linux-2.4.x/drivers/char/makefile中增加 obj-$(CONFIG_TS_S3C44B0) += s3c44b0xts.o举报
分享作者的其他最新日志路过鸡蛋鲜花握手雷人给妹妹的电脑配置
工作三年之後的痛(转)
发现一个减轻心理压力的好方法评论 (0 个评论) 涂鸦板发表评论全部嵌入式linux启动信息完全注释(转)
vi入门——巧表单方法【图文】{转}
vsftp配置详解
热门日志导读彦紫: 我们已经是谈不起恋爱的80后......
vvy: 君子无能愿自修9命怪猫: Excel快捷键操作大全
vvy: 选择题的启示
9命怪猫: 最近真背 评论9命怪猫: 桌面新出无法删除IE图标事件开源SNS - 联系我们 - 京ICP备号Powered by UCenter Home 2.0 (C)
Comsenz Inc.
欢迎转载:
推荐:    

我要回帖

更多关于 注册表数值数据 的文章

 

随机推荐