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方法同上。
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』