制止优先级
stm8的制止优先级不是固定稳固的,stm8的制止分为硬件优先级与软件优先级;当多个制止发生时,cpu会先相应软件优先级高的制止,若软件优先级相同会先相应硬件优先级高的;
其中软件优先级有四个
- /**
- * @brief ITC Priority Levels selection
- */
- typedef enum {
- ITC_PRIORITYLEVEL_0 = (uint8_t)0x02, /*!< Software priority level 0 (cannot be written) */
- ITC_PRIORITYLEVEL_1 = (uint8_t)0x01, /*!< Software priority level 1 */
- ITC_PRIORITYLEVEL_2 = (uint8_t)0x00, /*!< Software priority level 2 */
- ITC_PRIORITYLEVEL_3 = (uint8_t)0x03 /*!< Software priority level 3 */
- } ITC_PriorityLevel_TypeDef;
复制代码 例子:
- ITC_SetSoftwarePriority(ITC_IRQ_PORTE,ITC_PRIORITYLEVEL_2 );
复制代码 外部制止
stm8的全部io引脚都有外部制止本事;
IAR的制止处理声明
在固件库stm8s.h中可以找到这样一段代码
- #ifdef _IAR_
- #define STRINGVECTOR(x) #x
- #define VECTOR_ID(x) STRINGVECTOR( vector = (x) )
- #define INTERRUPT_HANDLER( a, b ) \
- _Pragma( VECTOR_ID( (b)+2 ) ) \
- __interrupt void (a)( void )
- #define INTERRUPT_HANDLER_TRAP(a) \
- _Pragma( VECTOR_ID( 1 ) ) \
- __interrupt void (a) (void)
- #endif /* _IAR_ */
复制代码 例子:
- INTERRUPT void EXTI_PORTE_IRQHandler(void);
- INTERRUPT_HANDLER(EXTI_PORTE_IRQHandler, 7)
- {
- if(KEY1==0)
- {
- delay_ms(20);
- while(KEY1==0);
- LED1_TOGGLE;
- }
- if(KEY2==0)
- {
- delay_ms(20);
- while(KEY2==0);
- LED2_TOGGLE;
- }
- }
复制代码 外部制止灵敏性(触发方式)
- /**
- * @brief EXTI Sensitivity values for PORTA to PORTE
- */
- typedef enum {
- EXTI_SENSITIVITY_FALL_LOW = (uint8_t)0x00, /*!< Interrupt on Falling edge and Low level */
- EXTI_SENSITIVITY_RISE_ONLY = (uint8_t)0x01, /*!< Interrupt on Rising edge only */
- EXTI_SENSITIVITY_FALL_ONLY = (uint8_t)0x02, /*!< Interrupt on Falling edge only */
- EXTI_SENSITIVITY_RISE_FALL = (uint8_t)0x03 /*!< Interrupt on Rising and Falling edges */
- } EXTI_Sensitivity_TypeDef;
复制代码 Falling edge 是下降沿
Rising edge 是上升沿
使用例子:
- EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOE, EXTI_SENSITIVITY_FALL_ONLY);
复制代码 实验程序
使用一个GPIO来作外部制止有这几个步骤
- GPIO_Init
- EXTI_SetExtIntSensitivity
- ITC_SetSoftwarePriority
- INTERRUPT_HANDLER 定义制止处理
- enableInterrupts
- #include "stm8s_gpio.h"#include "stm8s_itc.h"#include "stm8s_exti.h"bool pinn = FALSE;void delay(uint32_t delayTime);int main(void){ disableInterrupts(); GPIO_Init(GPIOA, GPIO_PIN_4, GPIO_MODE_OUT_PP_LOW_FAST); GPIO_Init(GPIOE, GPIO_PIN_6, GPIO_MODE_IN_PU_IT); EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOE, EXTI_SENSITIVITY_FALL_ONLY);
- ITC_SetSoftwarePriority(ITC_IRQ_PORTE, ITC_PRIORITYLEVEL_3); if (pinn == TRUE) { GPIO_WriteLow(GPIOA, GPIO_PIN_4); } else { GPIO_WriteHigh(GPIOA, GPIO_PIN_4); } enableInterrupts(); while (1) { }}void delay(uint32_t delayTime){ while (delayTime--) ;}INTERRUPT void EXTI_PORTE_IRQHandler(void);INTERRUPT_HANDLER(EXTI_PORTE_IRQHandler, 7){ BitStatus status; status = GPIO_ReadInputPin(GPIOE, GPIO_PIN_6); if (status == RESET) { pinn = !pinn; if (pinn == TRUE) { GPIO_WriteLow(GPIOA, GPIO_PIN_4); } else { GPIO_WriteHigh(GPIOA, GPIO_PIN_4); } }}
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |