STM8 单片机ADC、Timer、USART实用例程
这是一个我花了较长时间摸索出来的STM8L-051的例程,它控制LED灯,Timer2定时100us进入中断,软件启动ADC,采样10 次后取平均,将结果通过UASART发送至PC机,在超级终端上显示的实用程序,因其内存极小,不能用printf等函数,因此对于想用这款资源极少的MCU的开发者来说,读这篇文章会大大节约你的研发时间。有不会的问题请发邮件***************。
#include <stdio.h>
#include "stm8l15x.h"
#include "iostm8l051f3.h"
#define LED_GPIO_PORT GPIOA
#define LED_GPIO_PINS GPIO_Pin_2 | GPIO_Pin_3
/* Private function prototypes -----------------------------------------------*/
#define ADC1_DR_ADDRESS ((uint16_t)0x5344)
#define BUFFER_SIZE ((uint8_t) 0x02)
#define BUFFER_ADDRESS ((uint16_t)(&Buffer))
#define ASCII_NUM_0 ((uint8_t) 48)
#define ADC_RATIO ((uint16_t) 806) /*ADC_RATIO = ( 3.3 * 1000 * 1000)/4095*/
#define SampleADC ((uint8_t) 0x0A)
/* Private variables ---------------------------------------------------------*/
uint8_t Buffer[4] = {0, 0, 0, 0};
uint16_t ADCdata = 0;
uint16_t ADCvalue = 0;
unsigned char LED =1;
unsigned char c = 8;
单片机printf函数uint16_t acode = 1234; //43 "+" 0x2B;
void Delay(__IO uint16_t nCount)
{
/* Decrement nCount value */
while (nCount != 0)
{
nCount--;
}
}
//int putchar(int c)
//{
// while ((USART1_SR&0x80)==0x00);
// UART2_sendchar((u8)c);
// return (c);
//}
static void CLK_Config(void)
{
/* Select HSI as system clock source */
CLK_SYSCLKSourceSwitchCmd(ENABLE);
CLK_SYSCLKSourceConfig(CLK_SYSCLKSource_HSI);
/*High speed external clock prescaler: 1*/
CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1);
while (CLK_GetSYSCLKSource() != CLK_SYSCLKSource_HSI)
{}
/* Enable ADC1 clock */
CLK_PeripheralClockConfig(CLK_Peripheral_ADC1, ENABLE);
/* Enable DMA1 clock */
// CLK_PeripheralClockConfig(CLK_Peripheral_DMA1, ENABLE);
/* Enable TIM2 clock */
CLK_PeripheralClockConfig(CLK_Peripheral_TIM2, ENABLE);
CLK_PeripheralClockConfig(CLK_Peripheral_USART1, ENABLE);
}
static void GPIO_Config(void)
{
PC_DDR = 0X20;
PC_CR1 = 0X20;
PA_DDR = 0X0C;
PA_CR1 = 0X0C;
}
static void USART1_Config(void)
{
// ADCvalue = USART1_DR;
USART1_BRR2 = 0x03;
USART1_BRR1 = 0x68; //16M/9600=683
USART1_CR2 = 0x0C; //Transmitter & receiver enable
}
static void ADC_Config(void)
{
ADC1_CR2 = 0x22; //risign edge, softwae start, sampling time 16 ADC clock
ADC1_SQR3 = 0x80; //ADC = 15channel
ADC1_TRIGR1 = 0x10; //use internal ref,sampling time 16 ADC clock for Ref
RI_ASCR1 = 0x00;
}
void TIM2_Config(void)
{
TIM2_PSCR = 0x07; // 应是16,但只能置三位,所以是111 fCK_PSC / 2(PSC[2:0]).
// TIM2_PSCRL = 0x3F; // PSCR=0x1F3F,f=8M/(0x1F3F+1)=1000Hz,每个计数周期1ms
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论