#include "adch"
u16 TempADC;
void ADC_Config(void)
{
ADC_CR1 |= 0x01; //开始启动初始化必须启动一次
//第一次写1,ADC从低功耗唤醒,第二次写1,启动ADC转换
//ADC_CR1 |= 0x20; //使能转换结束中断,本例中采用的查询方式。
}
uint16_t Get_ADCCH_Value(ADC1_Channel_TypeDef ADC_Channel)
{
ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS,ADC_Channel, ADC1_PRESSEL_FCPU_D2,
ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_ALL, DISABLE);
//你也可以用 *** 作寄存器的方式代码如下,但未验证。
#if 0
ADC_CR2 = 0x00; // A/D结果数据左对齐
CLK_PCKENR2 |= 0x08; // 使能fMASTER与ADC的连接
ADC_CR1 = 0x00;// ADC时钟=主时钟/2=8MHz,单次转换模式
ADC_CSR = 0x01; // 选择通道2
ADC_TDRL = 0x01; // 禁止施密特触发功能
ADC_TDRH = 0x01;
ADC_CR1 = 0x03; //2分频,连续转换,启动ADC
ADC_CR2 = 0x31; //外部事件保留,数据右对齐,禁止扫描模式,
ADC_CSR|= 0x01; //选择通道1
#endif
ADC1_ConversionConfig(ADC1_CONVERSIONMODE_CONTINUOUS, ADC_Channel,ADC1_ALIGN_RIGHT);
ADC_CR1 |= 0x01; //开始启动转换
while(!(ADC_CSR & 0x80)); //等待转换结束
return ADC1_GetConversionValue(); //返回ADC结果
}
//这个初始化代码很重要,不能省,每次切换通道都要初始化一次!
在main函数中直接调用即可:
TempADC=Get_ADCCH_Value(ADC1_CHANNEL_1); //获取AD转化值
WetADC=Get_ADCCH_Value(ADC1_CHANNEL_3; //获取AD转化值
这个要看你用在什么场合,如果是用在内置电池的便携式设备的话,由于考虑到待机时间,以及电池在电压比较低的时候,单片机还要能够正常工作的话,就要选用STM8L系列。因为这个系列的功耗比较低,而且能够在很低的工作电压下工作。
如果是用在固定供电的设备上的话,选用STM8S系列不错!价格相对来说也比较实惠一点。
TM8的通用输入/输出口用于芯片和外部进行数据传输。一个IO端口可以包括多达8个引脚,每个引脚可以被独立编程作为数字输入或者数字输出口。另外部分口还可能会有如模拟输入,外部中断,片上外设的输入/输出等复用功能。但是在同一时刻仅有一个复用功能可以映射到引脚上。
复用功能的映射是通过选项字节控制的。请参考数据手册关于选项字节的描述。
每个端口都分配有一个输出数据寄存器,一个输入引脚寄存器,一个数据方向寄存器,一个选择寄存器,和一个配置寄存器。一个I/O口工作在输入还是输出是取决于该口的数据方向寄存器的状态。
GPIO主要功能
可选择的输入模式:浮动输入和带上拉输入
可选择的输出模式:推挽式输出和开漏输出
数据输入和输出采用独立的寄存器
外部中断可以单独使能和关闭
输出摆率控制用以减少EMC噪声
片上外设的I/O功能复用
当作为模拟输入时可以关闭输入施密特触发器来降低功耗
在数据输出锁存时支持读-修改-写
输入兼容5V电压
I/O口工作电压范围为16 V到VDDIOmax
I/O的配置和使用
每一个端口都有一个输出数据寄存器(ODR),一个引脚输入寄存器(IDR)和一个数据方向寄存器(DDR)总是同相关的。
控制寄存器1(CR1)和控制寄存器2(CR2)用于对输入/输出进行配置。任何一个I/O引脚可以通过对DDR,ODR,CR1和CR2寄存器的相应位进行编程来配置。
寄存器中的位n对应于口的引脚n。各种不同配置总结如表18。
(表18:IO口配置表)
注意:连接VDD的二极管在实际开漏极状态引脚是无效的,在引脚和VOL之间的局部保护设备重要性是有效的。
没有使用的I/O引脚必须连接到一个固定的电平值。或者是上拉或者是下拉。
输入模式
将DDRx位清零就选择了输入模式。在该模式下读IDR寄存器的位将返回对应I/O引脚上的电平值。
如表18所示,理论上STM8可以通过软件配置得到四种不同的输入模式:悬浮不带中断输入,悬浮带中断输入,上拉不带中断输入和上拉带中断输入。但是在实际情况下不是所有的口都具有外部中断能力和上拉,用户应参考数据手册中关于每个引脚的实际硬件性能描述来了解更多细节。
输出模式
将DDRx位置1就选择了输出模式。在该模式下向ODR寄存器的位写入数据将会通过锁存器输出对应数字值到I/O口。读IDR的位将会返回相应的I/O引脚电平值。通过软件配置CR1,CR2寄存器可以得到不同的输出模式:上拉输出,开漏输出。
低功耗模式
表19低功耗模式对STM8S的GPIO口的影响
模式 描述
等待(Wait) 对I/O口无影响。外部中断可以使MCU退出等待(Wait)模式
停机(Halt) 对I/O口无影响。外部中断可以使MCU从停机(Halt)模式唤醒
注意:如果PA1/PA2被用来连接外部谐振器,为了确保在HALT模式下有最低功耗必须配置PA1和PA2为带上拉输入。
stm8具有唯一id,可以利用这个id做程序加密
例如
#define ID_ENCRYPT_EOR_RESULT_ADDRESS (0x9ff0)
#define ID_ENCRYPT_ADD_RESULT_ADDRESS (0x9ff4)
void Stm8s103EncryptDemo(void)
{
uint32 u16IdAddress;
uint16 u32EorRslt, u16AddRslt;
//千万别显式的读取ID,即要把0x4865运算成隐式的,例如此例中0x4865 = (0x1194 4) + 0x215;
//这样,别人就算破解出了你的程序,也查找不到0x4865,这样就不能轻易的软解密,这样处理后如果要软解密,
//一定要反汇编出来进行复杂逆向分析,难度极大,代价极高,很难搞定软加密了,达到保护产品的目的。
gU16IdAdressVar = 0x1194;
gU16IdAdressVar <<= 2;
u16IdAddress = (uint16)(gU16IdAdressVar + 0x215);//0x4865
//读取单片机的ID,并进行运算,具体算法可以自己定,这里只用到简单的异或及和运算
u16EorRslt = (u16IdAddress) ^ ((u16IdAddress + 1)) ^ ((u16IdAddress + 2));
u16AddRslt = (u16IdAddress) + ((u16IdAddress + 1)) + ((u16IdAddress + 2));
//进行对比,如果运算结果与FLASH保存的结果不一样,说明非法,运行错误代码
if(u16EorRslt != ((uint16)ID_ENCRYPT_EOR_RESULT_ADDRESS))
{
while(1);//异或算法结果不正确,进行错误分支
}
if(u16AddRslt != ((uint32)ID_ENCRYPT_ADD_RESULT_ADDRESS))
{
while(1);//和算法结果不正确,进行错误分支
}
}
1,如果板子上有外部存储器,可以先编写一个程序,利用算法把id计算得到一些值存入外部存储器,然后再烧写真正的程序,真正的程序去校验外部存储器的数据是否合法即可
2,利用板子上按键组合,或是上电按住某些键,程序在这个时候利用算法把id计算得到一些值存入程序区(stm8为EE区),程序运行时去验证程序区数据是否正确
3,轩微编程器有软件加密的功能,编程器会读芯片id,根据算法直接改写缓冲区,达到软件加密的作用
4,读出的id通过一定算法,例如异或加上一个数,得到的数据存入flash(只运行一次,运行后标志位也存入flash),下次读到这个标志位,就不运行这个程序
1选项字节的概念(参考stm8s中文数据手册):
选项字节包括芯片硬件特性的配置和存储器的保护信息,这些字节保存在存储器中一个专用的
块内。除了ROP(读出保护)字节,每个选项字节必须被保存两次,一个是通常的格式(OPTx)和
一个用来备份的互补格式(NOPTx)。可以在ICP模式(通过SWIM)下访问下表中EEPROM的地址来修改选项字节。
选项字节也可以通过应用程序在IAP模式下修改,但是ROP选项只能在ICP模式(通过SWIM)下被
修改。
2ISP IAP ICP的概念(有待学习):
ISP:In System Programing, 在系统编程 程序完全下载
IAP:In applicating Programing,在应用编程 我的理解是用应用程序去修改芯片里边固定的一些数据(与应用编程无关的数据)
ICP:In Circuit Programing, 在电路编程
3stm8s芯片的备用功能重映射:
stm8s芯片上带有很多备用的功能,这些功能必须使用重映射功能才能实现,
重映射其实就是配置某个flash地址的某一位,使某个引脚具备备用功能或者默认功能的其中一个
而且一旦功能改,想恢复原来的功能必须重新写入。
比如stm8s的PD4端口具有TIM2_CH1 功能和BEEP功能,默认的情况下是TIM2_CH1功能,
当我们要用到BEEP功能时必须写选项字,将这个引脚重映射为BEEP功能。
4库函数实现重映射
//对于stm8s的选项字地址为0x4803#define Beep_OptionAdd 0x4803
void Set_Beep_OptionByte(void)
{
uint16_t Beep_Option_status;/记录激活备选功能Beep/TIM2_CH1的状态/
Beep_Option_status=FLASH_ReadOptionByte(Beep_OptionAdd);
/Beep_Option_status的最高位为1激活了Beep,否则不激活,为TIM2_CH1/
if((Beep_Option_status&0x8000))
{
FLASH_ProgramOptionByte(Beep_OptionAdd, (uint8_t)(Beep_Option_status&0x7fff));
/向Beep_OptionAdd 0x4803 置0,不激活激活了Beep,恢复TIM2_CH1通道/
}
}
以上就是关于如何使用STM8S单片机的多通道AD转换全部的内容,包括:如何使用STM8S单片机的多通道AD转换、STM8L和STM8S到底选哪个好、STM8当中的GPIO各模式如何用等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)