STM8S那些破事

2020-03-23来源: eefocus关键字:STM8S  外部中断  寄存器

1、中断的使用   EXTI_SetExtIntSensitivity


外部中断控制寄存器 1 (EXTI_CR1)

void EXTI_SetExtIntSensitivity(EXTI_Port_TypeDef Port, EXTI_Sensitivity_TypeDef SensitivityValue)

{


    /* Check function parameters */

    assert_param(IS_EXTI_PORT_OK(Port));

    assert_param(IS_EXTI_SENSITIVITY_OK(SensitivityValue));


    /* Set external interrupt sensitivity */

    switch (Port)

    {

    case EXTI_PORT_GPIOA:

        EXTI->CR1 &= (uint8_t)(~EXTI_CR1_PAIS);

        EXTI->CR1 |= (uint8_t)(SensitivityValue);

        break;

    case EXTI_PORT_GPIOB:

        EXTI->CR1 &= (uint8_t)(~EXTI_CR1_PBIS);

        EXTI->CR1 |= (uint8_t)((uint8_t)(SensitivityValue) << 2);

        break;

    case EXTI_PORT_GPIOC:

        EXTI->CR1 &= (uint8_t)(~EXTI_CR1_PCIS); //0x30

        EXTI->CR1 |= (uint8_t)((uint8_t)(SensitivityValue) << 4);

        break;

    case EXTI_PORT_GPIOD:

        EXTI->CR1 &= (uint8_t)(~EXTI_CR1_PDIS);

        EXTI->CR1 |= (uint8_t)((uint8_t)(SensitivityValue) << 6);

        break;

    case EXTI_PORT_GPIOE:

        EXTI->CR2 &= (uint8_t)(~EXTI_CR2_PEIS);

        EXTI->CR2 |= (uint8_t)(SensitivityValue);

        break;

    default:

        break;

    }

}


#define IS_EXTI_SENSITIVITY_OK(SensitivityValue)

  (((SensitivityValue) == EXTI_SENSITIVITY_FALL_LOW) ||

   ((SensitivityValue) == EXTI_SENSITIVITY_RISE_ONLY) ||

   ((SensitivityValue) == EXTI_SENSITIVITY_FALL_ONLY) ||

   ((SensitivityValue) == EXTI_SENSITIVITY_RISE_FALL))


使用举例:


利用外部中断做按键检测


key 初始化


void Buttom_Init(void)

{

    GPIO_Init(GPIOB,Buttom2|Buttom1,GPIO_MODE_IN_PU_IT);

    EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOB, EXTI_SENSITIVITY_FALL_ONLY);

}

中断向量指定的是Port_D  (注意每个port只有一个中断相应,触发后会跳入同一个中断函数)


中断响应 (stm8s_interruput.c)


__interrupt void EXTI_PORTB_IRQHandler(void)

{

  if((PB_IDR & 0x08)==0)  //PB4 FAIL

  {

    delay_ms(10);

    if((PB_IDR & 0x08)==0)

    {

      UART1_SendString("PB4_Downn",

                              sizeof("PB4_Downn"));

      //**需要中断处理的函数放这**//

    }

  }

}



读取Unique ID


1.读出ID号


 #define     ID_BaseAddress         (0x48CD)     //stm8s105  具体的看芯片手册


void GetUniqueID(unsigned char *p)

{

     unsigned char i;

     unsigned char *pIDStart=(unsigned char *)(ID_BaseAddress);    

     for(i=0;i!=12;i++){*p++=*pIDStart++;}

}


或者


u8 STM8S_ID[12];


void Get_STM8S_UniqueID(void)//Get STM8S Unique ID



    u8 i=0;


    for(i=0; i<12; i++) 


        STM8S_ID[i] = *(u8*)(0x48CD+i); 



1、可以使用CRC32算法将12位改为4位 


2、


#if defined (STM8S208) || defined (STM8S207) || defined (STM8AF52Ax) || defined (STM8AF62Ax)

 #define FLASH_PROG_END_PHYSICAL_ADDRESS   ((uint32_t)0x027FFF) /*!< Program memory: end address */

 #define FLASH_PROG_BLOCKS_NUMBER          ((uint16_t)1024)     /*!< Program memory: total number of blocks */

 #define FLASH_DATA_START_PHYSICAL_ADDRESS ((uint32_t)0x004000) /*!< Data EEPROM memory: start address */

 #define FLASH_DATA_END_PHYSICAL_ADDRESS   ((uint32_t)0x0047FF) /*!< Data EEPROM memory: end address */

 #define FLASH_DATA_BLOCKS_NUMBER          ((uint16_t)16)       /*!< Data EEPROM memory: total number of blocks */

 #define FLASH_BLOCK_SIZE                  ((uint8_t)128)       /*!< Number of bytes in a block (common for Program and Data memories) */

#endif /* STM8S208, STM8S207, STM8AF52Ax, STM8AF62Ax */


 


 


 


 


gpio.c内有14个函数,其中读写操作9个、初始化操作3个、复用( Changes the mapping of the specified pin.---更改指定引脚映像),还有一个 Specifies the pins to be toggled.<切换指定引脚>。


一、函数


1、读写操作


uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)  //读取输入I/O口的引脚值   ---0或1


uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx)//读取输入I/O口状态值


uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) //读取输出I/O口的引脚值


uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx)//读取输出I/O状态值


void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)//I/O口的引脚值置高


void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)//I/O口的引脚值置低


void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal)/向I/O引脚写入数据


void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal)//向I/O口写入数据


void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)//锁定I/O口


2、初始化操作


void GPIO_DeInit(GPIO_TypeDef* GPIOx)


void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)//I/O口初始化


void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct)//GPIO_InitStruct置默认值


3、复用操作


void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF)


4、toggle bit


void GPIO_ToggleBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)


二、使用方法


1.读写操作


读写操作使用了GPIO_TypeDef、uint16_t定义参数,使用时需根据具体要求选择合适的参数。


2.初始化操作


使用该类函数之前需要获得GPIO_InitStryct结构体,并赋值。再调用该函数。


3、4方法同上。

关键字:STM8S  外部中断  寄存器 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic492360.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:模拟串口--基于STM8普通IO口的模拟串口驱动程序
下一篇:STM8S串口下载

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM8s外部时钟晶振失效时钟安全系统CSS启动演示
使用的最小系统晶振是8m的。这里说下配置过程:时钟自动切换,开启切换中断在中断里面清除中断标志,使能CSS并开启CSS中断CSS中断发生,清除CSS中断标志,将HSI二分频,即16M/2=8M,与外部晶振相同,这样不会影响串口波特率窗口输出配置信息:用手触碰PA1、PA2引脚使外部晶振失效串口输出CSS中断
发表于 2020-03-09
STM8s外部时钟晶振失效时钟安全系统CSS启动演示
STM8S103之时钟设置
最大时钟(指的是system clock):外部晶振24MHz,内部高速RC16MHz三个时钟源:外部晶振、内部高速RC(上电默认) +内部低速RC几个时钟:master clock(即sytem clock),fcpu,外设时钟、AWU时钟调用库函数中CLK_ClockSwitchConfig,参考库函数clk_clockselection,但是分频还得进一步设置上电默认:内部高速RC,HSIDIV=/8,CPUDIV=/1,外部时钟全使能,查看相关寄存器的Reset value
发表于 2020-03-09
STM8S103之时钟设置
STM8S如何跑24M的HSE晶振
就这么几步,第一步: 检查STM8s.h头文件配置/**  * @brief  In the following line adjust the value of External High Speed oscillator (HSE)   used in your application   Tip: To avoid modifying this file each time you need to use different HSE, you        can define the HSE value in your
发表于 2020-03-08
STM8S开发入门之使用EWSTM8(IAR STM8S)新建工程点亮一个LED
1、预先安装好EWSTM8(IAR STM8)软件,全称为IAR Embedded Workbench for STMicroelectronics STM8 IDE2、下载好STM8S标准库,此处所用标准库为STM8S_StdPeriph_Lib V2.3.13、新建个文件夹(名称自定),作为项目所在文件夹,并在项目文件夹里再新建两个文件夹,此处分别命名为FWLIB和USER。(注:这两个文件夹名字可以按你们自己意思取,无限制,如可以取HWLIB、SYSLIB、MYLIB、MYAPP、MYABC、XZY等)4、将STM8S标准库(STM8S_StdPeriph_Lib V2.3.1)——Project
发表于 2020-03-08
STM8S开发入门之使用EWSTM8(IAR STM8S)新建工程点亮一个LED
STM8L052定时器1配置30S
@[TOC]STM8L TIM1相关配置Tim1基本介绍TIM1由一个由可编程预分频器驱动的16位上下自动重载计数器组成。定时器可用于多种用途,包括:•时基生成•测量输入信号的脉冲长度(输入捕获)•生成输出波形(输出比较,PWM和单脉冲模式)•各种事件的中断功能(捕获,比较,溢出,中断,触发)•捕获,比较,溢出事件的DMA请求功能•与其他定时器或外部信号同步(外部时钟,复位,触发可校准)。该定时器非常适用于各种控制应用,包括那些需要具有互补输出和死区时间插入的中心对齐PWM功能的应用。定时器时钟可以来自内部时钟,也可以来自可通过配置寄存器选择的外部源。配置以下代码 自己配置了一个30S定时器,使用系统内部高速时钟16M,1600
发表于 2020-03-06
STM8S触摸按键固件库详解
由于刚好有小项目需要用到触摸按键,stm8s可以节约一块触摸按键的片子,并且成本比较低。在某些对成本比较敏感的应用还是有价值的。现将自己网上找到的资料与自己学习的心得记下与大家分析。ST的底层库对滚动条也支持,效果还是不错的一、原理分析ST的电容式触摸按键方案通过一个电阻和感应电极的电容CX构成的阻容(RC)网络的充电/放电时间来检测人体触摸所带来的电容变化。如上图所示,当人手按下时相当于感应电极上并联了一个电容Cx,增加了感应电极上的电容,感应电极进行充放电的时间会增加,从而检测到按键的状态。先用开关将 Cs(或 Cs+Cx)上的电放尽,然后断开开关,让 R 给 Cs(或 Cs+Cx)充电,当没有手指触摸的时候, Cs 的充电
发表于 2020-03-05
STM8S触摸按键固件库详解
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved