历史上的今天
今天是:2025年03月23日(星期日)
2020年03月23日 | STM8S那些破事
2020-03-23 来源:eefocus
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方法同上。
上一篇:模拟串口--基于STM8普通IO口的模拟串口驱动程序
下一篇:STM8S串口下载
史海拾趣
|
运算放大器在电路中发挥重要的作用,其应用已经延伸到汽车电子、通信、消费等各个领域,并将在支持未来技术方面扮演重要角色。在运算放大器的实际应用中,设计工程师经常遇到诸如选型、供电电路设计、偏置电路设计、PCB设计等方面的问题。在电子工 ...… 查看全部问答> |
|
高压输电线路绝缘子内缺陷带电检测装置专利号:ZL 02 2 40245.4华北电力大学(北京)网上宣传很多,唯有我们学校在生产,望慎重甄别,以防假冒!010-60120676 13601208165 okgod123@126.com 于老师 用电场法原理,整体水平达到国 ...… 查看全部问答> |
|
我们平时的设计用得比较多的是74LS和74HC两个系列的芯片。这里为大家提供一些特殊的74系列芯片资料。 主要包括16个子系列,这些子系列虽然不常用的,但却是很有用的,如果用普通的LS和HC系列满足不了设计需要,不妨看一看这些系列的芯片,很有可能 ...… 查看全部问答> |
|
本帖最后由 paulhyde 于 2014-9-15 09:21 编辑 除电子设计大赛外,有哪些比赛啊!像什么杯之类的,有没有,大家介绍一下啊!聊一下参赛的一下经验啊! … 查看全部问答> |
|
4层板 地平面分割后只在一点连接,两区之间的信号线怎么不跨分割呢?比如单片机出来的脉冲信号有送去给模拟电路的时候。 而且单片机下面的地要怎么分割,除了内置ADC相关的引脚,其它区域都铺数字地吗?类似的,像DAC和ADC要跨分割沟来放可以吗? ...… 查看全部问答> |




