stm8s单片机(二)外部制止实验

打印 上一主题 下一主题

主题 1016|帖子 1016|积分 3048

制止优先级

stm8的制止优先级不是固定稳固的,stm8的制止分为硬件优先级与软件优先级;当多个制止发生时,cpu会先相应软件优先级高的制止,若软件优先级相同会先相应硬件优先级高的;
其中软件优先级有四个
  1. /**
  2.   * @brief  ITC Priority Levels selection
  3.   */
  4. typedef enum {
  5.   ITC_PRIORITYLEVEL_0 = (uint8_t)0x02, /*!< Software priority level 0 (cannot be written) */
  6.   ITC_PRIORITYLEVEL_1 = (uint8_t)0x01, /*!< Software priority level 1 */
  7.   ITC_PRIORITYLEVEL_2 = (uint8_t)0x00, /*!< Software priority level 2 */
  8.   ITC_PRIORITYLEVEL_3 = (uint8_t)0x03  /*!< Software priority level 3 */
  9. } ITC_PriorityLevel_TypeDef;
复制代码
例子:
  1. ITC_SetSoftwarePriority(ITC_IRQ_PORTE,ITC_PRIORITYLEVEL_2 );
复制代码
外部制止

stm8的全部io引脚都有外部制止本事;

IAR的制止处理声明

在固件库stm8s.h中可以找到这样一段代码
  1. #ifdef _IAR_
  2. #define STRINGVECTOR(x) #x
  3. #define VECTOR_ID(x) STRINGVECTOR( vector = (x) )
  4. #define INTERRUPT_HANDLER( a, b )  \
  5. _Pragma( VECTOR_ID( (b)+2 ) )        \
  6. __interrupt void (a)( void )
  7. #define INTERRUPT_HANDLER_TRAP(a) \
  8. _Pragma( VECTOR_ID( 1 ) ) \
  9. __interrupt void (a) (void)  
  10. #endif /* _IAR_ */
复制代码
例子:
  1. INTERRUPT void EXTI_PORTE_IRQHandler(void);
  2. INTERRUPT_HANDLER(EXTI_PORTE_IRQHandler, 7)
  3. {
  4.         if(KEY1==0)
  5.         {
  6.                 delay_ms(20);
  7.                 while(KEY1==0);
  8.                 LED1_TOGGLE;
  9.         }
  10.         if(KEY2==0)
  11.         {
  12.                 delay_ms(20);
  13.                 while(KEY2==0);
  14.                 LED2_TOGGLE;       
  15.         }
  16. }
复制代码
外部制止灵敏性(触发方式)

  1. /**
  2.   * @brief  EXTI Sensitivity values for PORTA to PORTE
  3.   */
  4. typedef enum {
  5.   EXTI_SENSITIVITY_FALL_LOW  = (uint8_t)0x00, /*!< Interrupt on Falling edge and Low level */
  6.   EXTI_SENSITIVITY_RISE_ONLY = (uint8_t)0x01, /*!< Interrupt on Rising edge only */
  7.   EXTI_SENSITIVITY_FALL_ONLY = (uint8_t)0x02, /*!< Interrupt on Falling edge only */
  8.   EXTI_SENSITIVITY_RISE_FALL = (uint8_t)0x03  /*!< Interrupt on Rising and Falling edges */
  9. } EXTI_Sensitivity_TypeDef;
复制代码
Falling edge 是下降沿
Rising edge 是上升沿
使用例子:
  1. EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOE, EXTI_SENSITIVITY_FALL_ONLY);
复制代码
实验程序

使用一个GPIO来作外部制止有这几个步骤

  • GPIO_Init
  • EXTI_SetExtIntSensitivity
  • ITC_SetSoftwarePriority
  • INTERRUPT_HANDLER 定义制止处理
  • enableInterrupts
  1. #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);
  2.   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企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

欢乐狗

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表