stm8 代码一键生成方便快捷

本文介绍了一个基于STM32的嵌入式系统开发案例,包括了硬件初始化、ADC采样、串口通信、定时器配置、外部中断处理、EEPROM操作等关键模块的实现方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 

下载链接

链接:https://pan.baidu.com/s/1sWsX1IEf8HnlWvq1zNJYmA 
提取码:004z 
复制这段内容后打开百度网盘手机App,操作更方便哦

 

 

#include <iostm8s103f3.h>

#define        uint         unsigned    int
#define        uchar        unsigned    char
#define        ulong        unsigned    long

#define        MASS_KEY1        0xAE
#define        MASS_KEY2        0x56
#define        EEP_BASE         0x4000

void  delay_ms(uchar  ms)
{
    uchar  i,j;
    while(ms--)
    {
        for(i=4;i!=0;i--)
          for(j=100;j!=0;j--);
    }
}

void  adc_init(void)
{
    ADC_CR1_ADON = 1;      //打开adc
    ADC_CSR_CH = 0;        //AIN0脚
    ADC_CSR_EOCIE = 1;     //打开ADC中断
    ADC_CR1_SPSEL = 2;     //4分频时钟
}

/*
uint  adc_get(void)
{
    uint  dataH, dataL;
    ulong  value = 0;
    uint   voltage = 0;         //电压单位为(mV)
    ADC_CR1_ADON = 1;           //使能adc
    while(ADC_CSR_EOC==0);
    dataH = ADC_DRH;            //左对齐数据
    dataL = ADC_DRL;            //读取寄存器数据
    ADC_CSR_EOC = 0;
    value = dataH<<2|dataL;
    voltage = (value*5000)>>10;     //计算实际电压
    return  voltage;
}

//中位值滤波
uint  Sort_detection(uchar  channel)
{
    uchar   i,j,k;
    uint    tmp,adc_buf[5];
    ADC_CSR_CH = channel;
    asm("nop");
    asm("nop");
    asm("nop");
    for(i=0;i<5;i++)
    {
        adc_buf[i] = adc_get();
        delay_ms(1);
    }
    for(j=4;j>0;j--)
    {
        for(k=0;k<j;k++)
        {
            if(adc_buf[k]>adc_buf[k+1])
            {
                tmp = adc_buf[k+1];
                adc_buf[k+1] = adc_buf[k];
                adc_buf[k] = tmp;
            }
        }
    }
    return  adc_buf[2];
}
*/

void  uart1_init(void)
{
    UART1_CR1=0x00;
    UART1_CR2=0x00;
    UART1_CR3=0x00;
    UART1_BRR2 = 0x01;
    UART1_BRR1 = 0x01;     //115200波特率
}

void  Exit_Init(void)
{
    EXTI_CR1_PAIS = 2;    //下降沿触发
}

void  WDT_Init(void)
{
    IWDG_KR = 0xCC;       //启动看门狗
    IWDG_KR = 0x55;       //解除写保护
    IWDG_PR = 0x06;       //256分频,最高1.02秒
    IWDG_RLR = 125;       //500ms
    IWDG_KR = 0xAA;       //写保护
}

void  WDT(void)
{
    IWDG_KR = 0xAA;       //喂狗指令WDT();
}

void  EEP_Init(void)
{
    FLASH_CR1 = 0x00;
    FLASH_CR2 = 0x00;
    FLASH_NCR2 = 0xff;
    FLASH_DUKR = MASS_KEY1;
    FLASH_DUKR = MASS_KEY2;
    while(!FLASH_IAPSR_DUL);        //等待写保护解锁
}

void  eep_write(uint addr,uchar dat) //不同芯片,EEPROM容量不同
{
    *((uchar*)(addr + EEP_BASE)) = dat;
    while(!FLASH_IAPSR_EOP);        //等待写完成
}

uchar  eep_read(uint addr)
{
    return  *((uchar*)(EEP_BASE + addr));
}

void  timer_Init(void)
{
    TIM1_PSCRH = 0;
    TIM1_PSCRL = 1;          //(1+1)分频为1M
    TIM1_ARRH = 0x3;
    TIM1_ARRL = 0xE8;        //每1000us中断一次
    TIM1_IER = 0x01;         //允许更新中断
    TIM1_CR1 = 0x01;         //计数器使能,开始计数

    //TIM2/3/4/5/6须使用与芯片对应的头文件
    TIM2_PSCR_PSC = 1;          //2^1 分频为1M 
    TIM2_ARRH = 0x3;
    TIM2_ARRL = 0xE8;        //每1000us中断一次
    TIM2_IER = 0x01;         //允许更新中断
    TIM2_CR1 = 0x01;         //计数器使能,开始计数
}

void  main(void)
{
    asm("sim");    //关总中断
    adc_init();
    uart1_init();
    Exit_Init();
    EEP_Init();
    timer_Init();
    WDT_Init();
    asm("rim");    //开总中断
    while(1)
    {
        asm("nop");
    }
}

#define   TLI_vector               0x02
#define   EXTI0_PA_vector          0x05
#define   EXTI1_PB_vector          0x06
#define   EXTI2_PC_vector          0x07
#define   EXTI3_PD_vector          0x08
#define   EXTI4_PE_vector          0x09

#pragma   vector = EXTI0_PA_vector
__interrupt  void  EXTI0_PA(void)
{
    //your code here
}

#pragma   vector = 0x18
__interrupt  void  ADC_EOC(void)
{
    //左对齐先读高位,右对齐先读低位
    //add  your code
    ADC_CSR_EOC = 0;
}

#pragma   vector = TIM1_OVR_UIF_vector
__interrupt void TIM1_OVR_UIF(void)
{
    TIM1_SR1_UIF = 0;
    //add your code here
}

#pragma   vector = TIM2_OVR_UIF_vector
__interrupt void TIM2_OVR_UIF(void)
{
    TIM2_SR1_UIF = 0;
    //add your code here
}

 

 

以及电阻分压  电阻并联计算

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值