最近在淘宝逛的时分发现了一款单片机,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_t HexTable[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
uint8_t i=0;
//串口UART1初始化
void Init_UART(void)
{
//默许初始化
UART1_DeInit();
//设置波特率9600 8位数据 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初始化
void Init_Timer4(void)
{
//1ms中止一次
TIM4_TimeBaseInit(TIM4_PRESCALER_128, 124);
/* Clear TIM4 update flag */
TIM4_ClearFlag(TIM4_FLAG_UPDATE);
/* Enable update interrupt */
TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE);
TIM4_Cmd(ENABLE);
}
//发送字节
void Send(uint8_t dat)
{
//查看并等候发送寄存器是否为空
while(( UART1_GetFlagStatus(UART1_FLAG_TXE)==RESET));
//发送字节
UART1_SendData8(dat);
}
//发送16位16进制
void UART1_mysend16hex(u16 dat)
{
Send(HexTable[(dat>>12)&0x0f]);
Send(HexTable[(dat>>8)&0x0f]);
Send(HexTable[(dat>>4)&0x0f]);
Send(HexTable[(dat)&0x0f]);
}
//发送8位16进制
void UART1_mysend8hex(uint8_t dat)
{
Send(HexTable[(dat>>4)&0x0f]);
Send(HexTable[(dat)&0x0f]);
Send('U');
}
void main()
{
//初始化
Init_UART();
Init_Timer4();
//中止敞开
enableInterrupts();
while(1)
{
}
}
//这个有必要加上 否则会报错 估量是库的要求
#ifdef USE_FULL_ASSERT
void assert_failed(u8* file, u32 line)
{
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"
extern uint8_t i;
uint8_t channel=1 ;
//接纳寄存器溢出中止
INTERRUPT_HANDLER(UART1_RX_IRQHandler, 18)
{
/* In order to detect unexpected events during development,
it is recommended to set a breakpoint on the following instruction.
*/
//下面是我做的安卓上位机发送过来的数据判别,这儿能够改成自己想要的程序
uint8_t tempData;
tempData = UART1_ReceiveData8();
if(tempData=='A')
{
channel = 0;
}
if(tempData=='Z')
{
channel = 1;
}
//铲除UART1中止标识符
UART1_ClearITPendingBit(UART1_IT_RXNE);
}
//定时器4计数器溢出中止