当前位置:首页 > 单片机 > 单片机
[导读]最近在淘宝逛的时候发现了一款单片机,STM8。相比之前一直使用的也是8位的AVR相比,感觉STM8更为强大,芯片特点如下:内核:具有3级流水线的哈佛结构、扩展指令集程序存储器:8K字节Flash;RAM:1K字节数据存储器:6

最近在淘宝逛的时候发现了一款单片机,STM8。相比之前一直使用的也是8位的AVR相比,感觉STM8更为强大,芯片特点如下:


内核:具有3级流水线的哈佛结构、扩展指令集

程序存储器:8K字节Flash;RAM:1K字节

数据存储器:640字节真正的数据EEPROM;可达30万次擦写

更重要的一点就是STM8系列若使用库编程的话,可以方便的不同芯片的程序移植。甚至可以方便的移植到STM32上面,大大减轻了更新硬件的重写程序的工作量。

ADC0832为8位分辨率A/D转换芯片,其最高分辨可达256级,可以适应一般的模拟量转换要求。其内部电源输入与参考电压的复用,使得芯片的模拟电压输入在0~5V之间。芯片转换时间仅为32μS,据有双数据输出可作为数据校验,以减少数据误差,转换速度快且稳定性能强。独立的芯片使能输入,使多器件挂接和处理器控制变的更加方便。通过DI数据输入端,可以轻易的实现通道功能的选择。(简述和图片均来之百度百科)



本文适合STM8控制ADC0832,程序是使用库编程,编译工具IAR。其实STM8也自带ADC转换模块了......

本程序还包括蓝牙串口通信,方便将得到数据从串口输出,我是编写了安卓上位机的app,方便在安卓上面显示图像。

程序还是用了定时器TIM4,确保每次采样的间隔大致相等,对之后的数据处理提供了基础。

先介绍核心mian.c文件,主要功能是初始化串口UART1,定时器TIMER4,还有一个发送16进制的函数。其中发送完数据再发送一个字符’U’作为一个数据的结束(你也可以自己定义)。这里说说为什么要选用16进制,而不是10进制,STM8速度有限,为了减少单指令操作,程序用了移位操作,这样可得到16进制每位数值,在发送到安卓上位机,上位机运算速度快,再转化成10进制,这样可以资源合理分配。


main.c程序:

#include"stm8s.h"

#include"stm8s_it.h"

uint8_tHexTable[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};

uint8_ti=0;

//串口UART1初始化

voidInit_UART(void)

{

//默认初始化

UART1_DeInit();

//设置波特率96008位数据1位停止位无校验外部时钟不可用模式接收发送

UART1_Init((u32)9600,UART1_WORDLENGTH_8D,UART1_STOPBITS_1,UART1_PARITY_NO,UART1_SYNCMODE_CLOCK_DISABLE,UART1_MODE_TXRX_ENABLE);

//设置接收寄存器溢出中断

UART1_ITConfig(UART1_IT_RXNE_OR,ENABLE);

}

//定时器TIM4初始化

voidInit_Timer4(void)

{

//1ms中断一次

TIM4_TimeBaseInit(TIM4_PRESCALER_128,124);

/*ClearTIM4updateflag*/

TIM4_ClearFlag(TIM4_FLAG_UPDATE);

/*Enableupdateinterrupt*/

TIM4_ITConfig(TIM4_IT_UPDATE,ENABLE);

TIM4_Cmd(ENABLE);

}

//发送字节

voidSend(uint8_tdat)

{

//检查并等待发送寄存器是否为空

while((UART1_GetFlagStatus(UART1_FLAG_TXE)==RESET));

//发送字节

UART1_SendData8(dat);

}

//发送16位16进制

voidUART1_mysend16hex(u16dat)

{

Send(HexTable[(dat>>12)&0x0f]);

Send(HexTable[(dat>>8)&0x0f]);

Send(HexTable[(dat>>4)&0x0f]);

Send(HexTable[(dat)&0x0f]);

}

//发送8位16进制

voidUART1_mysend8hex(uint8_tdat)

{

Send(HexTable[(dat>>4)&0x0f]);

Send(HexTable[(dat)&0x0f]);

Send('U');

}

voidmain()

{

//初始化

Init_UART();

Init_Timer4();

//中断开启

enableInterrupts();

while(1)

{

}

}

//这个必须加上不然会报错估计是库的要求

#ifdefUSE_FULL_ASSERT

voidassert_failed(u8*file,u32line)

{

while(1)

{

}

}

#endif



接下来说说中断函数表stm8s_it.c

其中只要选用两个中断函数就可以了:

INTERRUPT_HANDLER(UART1_RX_IRQHandler,18)接收寄存器溢出中断

里面添加安卓上位机发送过来的数据的处理程序,我这里写的是ADC0832通道选择的判断。

INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler,23)定时器4计数器溢出中断

里面添加初始化ADC0832和ADC0832数据读取并UART1发送到安卓上位机。


stm8s_it.c程序:

#include"stm8s_it.h"

#include"ADC0832.h"

externuint8_ti;

uint8_tchannel=1;

//接收寄存器溢出中断

INTERRUPT_HANDLER(UART1_RX_IRQHandler,18)

{

/*Inordertodetectunexpectedeventsduringdevelopment,

itisrecommendedtosetabreakpointonthefollowinginstruction.

*/

//下面是我做的安卓上位机发送过来的数据判断,这里可以改成自己想要的程序

uint8_ttempData;

tempData=UART1_ReceiveData8();

if(tempData=='A')

{

channel=0;

}

if(tempData=='Z')

{

channel=1;

}

//清除UART1中断标识符

UART1_ClearITPendingBit(UART1_IT_RXNE);

}

//定时器4计数器溢出中断

INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler,23)

{

/*Inordertodetectunexpectedeventsduringdevelopment,

itisrecommendedtosetabreakpointonthefollowinginstruction.

*/

//1*10m执行一次

i++;

if(i==10)

{

//进行ADC数模转换

//初始化ADC芯片,写入通道

AD_init(channel);

u8u8_adc1_value;

//进行数据读出

u8_adc1_value=AD_read();

//发送8位数据

UART1_mysend8hex(u8_adc1_value);

//清除UART1中断标识符

UART1_ClearITPendingBit(UART1_IT_RXNE);

i=0;

}

TIM4_ClearITPendingBit(TIM4_IT_UPDATE);

}


这里说说ADC0832的操作函数:ADC0832.c

程序包括初始化STM8的GPIO,初始化ADC0832和读取ADC0832数据

主要是DODI端口复用的问题,由于STM8端口作为输入输出,需要重新初始化GPIO,所以比一般51单片机的程序要复杂一点。最后读取数据先是从高位读出,再低位读出,进行校验,相同数值再输出。

附上时序图



ADC0832.c程序:

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

程序名称:ADC0832子程序

作者:devinzhang91

时间:2014.10.04

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

#ifndefADC0832_H

#defineADC0832_H

#include"stm8s.h"

//端口设置

#defineCLK_GPIO_PORT(GPIOC)

#defineCLK_GPIO_PINS(GPIO_PIN_3)

#defineDI_GPIO_PORT(GPIOC)

#defineDI_GPIO_PINS(GPIO_PIN_4)

#defineDO_GPIO_PORT(GPIOC)

#defineDO_GPIO_PINS(GPIO_PIN_4)

#defineCS_GPIO_PORT(GPIOC)

#defineCS_GPIO_PINS(GPIO_PIN_1)

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

函数名称:voidioInit(void)

函数作用:初始化GPIO

参数说明:null

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

voidioInit(void)

{

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭