嵌入式 > 技术百科 > 详情

STM8S那些破事

发布时间:2023-01-13 发布时间:
|

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


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
光纤通道的实时数字图像存储