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_Down\n",\
                              sizeof("PB4_Down\n"));
      //**需要中断处理的函数放这**//
    }
  }
}

 

 

 

读取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方法同上。
 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值