STM32学习2(GPIO EXTI SYSTICK)

  GPIO的使用:

  打开GPIO时钟根据手册寄存器映射看在哪根总线上,设一个GPIO_InitTypeDef结构体变量,根据实际给改结构体里面各项赋值,GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct),就初始化设置完了。

  具体应用读写直接调用

/* GPIO Read and Write functions **********************************************/
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
void GPIO_ToggleBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

  EXTI外设上引脚电平变化中断:

  先设置GPIO,记得pupd中设为浮空GPIO_PuPd_NOPULL;

EXTI_InitTypeDef EXTI_KEYSCAN_Struct;

/*enable syscfg clock*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);
/*select pa0*/
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource0);
/*Specifies the EXTI lines to be enabled or disabled.select EXTI0*/
EXTI_KEYSCAN_Struct.EXTI_Line = EXTI_Line0;
/*Specifies the new state of the selected EXTI lines.*/
EXTI_KEYSCAN_Struct.EXTI_LineCmd = ENABLE;
/*Specifies the mode for the EXTI lines.set mode to intterrupt*/
EXTI_KEYSCAN_Struct.EXTI_Mode = EXTI_Mode_Interrupt;
/*Specifies the trigger signal active edge for the EXTI lines.*/
EXTI_KEYSCAN_Struct.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_Init(&EXTI_KEYSCAN_Struct);

/*这部分设置中断优先级,这里我就随便写了一个,优先级组是0,抢占优先级是0,次优先级是1*/

NVIC_InitTypeDef NVIC_InitStruct;
/*Configures the priority grouping: pre-emption priority and subpriority.*/
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
/*!< Specifies the IRQ channel to be enabled or disabled.This parameter can be an enumerator of @ref IRQn_Type enumeration (For the complete STM32 Devices IRQ Channels
list, please refer to stm32f4xx.h file) */
NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;//STM32F4XX Interrupt Number Definition
/*!< Specifies whether the IRQ channel defined in NVIC_IRQChannel will be enabled or disabled. This parameter can be set either to ENABLE or DISABLE */
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
/*!< Specifies the pre-emption priority for the IRQ channel specified in NVIC_IRQChannel. This parameter can be a value between 0 and 15 as described in the table @ref MISC_NVIC_Priority_Table
A lower priority value indicates a higher priority */
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
/*!< Specifies the subpriority level for the IRQ channel specified in NVIC_IRQChannel. This parameter can be a value between 0 and 15 as described in the table @ref MISC_NVIC_Priority_Table
A lower priority value indicates a higher priority */
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;

NVIC_Init(&NVIC_InitStruct);

然后就是中断函数了

void EXTI0_IRQHandler(void)//这名字不能变,不然就进到启动文件中中断弱定义的部分中去了。
{
if((EXTI_GetITStatus(EXTI_Line0))!=RESET)//看下是不是真的这个中断了
{
//该干嘛干嘛
}

EXTI_ClearITPendingBit(EXTI_Line0);//出中断之前清下标志位
}

  SysTick:

  这是在内核中的,core-m4通用;

  只要调用这个函数配置  __STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)

void init_Systick(uint32_t time)
{
/*SystemCoreClock = 180mhz 1/time s interrupt*/
if(SysTick_Config(SystemCoreClock/time)) while(1);
}

void delay_ms(uint32_t time0)
{
DELAYTIME = time0;
while(DELAYTIME != 0);
}

中断有预先写好,往里面填就行了

void SysTick_Handler(void)
{
if(DELAYTIME!=0)
{
DELAYTIME--;
}
}

时间: 2024-08-30 15:44:22

STM32学习2(GPIO EXTI SYSTICK)的相关文章

STM32学习笔记9(SysTick滴答时钟)

我不得不说意法半导体确实有点风骚!甚至有点变态.我对ST文档 STM32F10XXX参考手册的编辑水平真是不敢恭维.手册中好多说明都是含糊不清,甚至将好多对初学者来说很重要的地方都一笔带过,让人着实摸不着头脑.比如前面我说过的关于NVIC嵌套向量中断控制器的介绍,这部分我认为是非常重要的,但当你看完他这部分介绍,你根本不会设置中断服务程序,他有哪些寄存器都不知道,更别说去设置了,NVIC的详细介绍是在Cotex-M3中有详细的介绍,不多说.今天我们说的是systick定时器. systick定时

Duanxx的STM32学习:GPIO的位带操作

支持了位带操作后,可以使用普通的加载/存储指令来对单一的比特进行读写.在 CM3中,有两个区中实现了位带.其中一个是 SRAM 区的最低 1MB 范围,第二个则是片内外设区的最低 1MB 范围.这两个区中的地址除了可以像普通的 RAM 一样使用外,它们还都有自己的"位带别名区",位带别名区把每个比特膨胀成一个 32 位的字.当你通过位带别名区访问这些字时,就可以达到访问原始比特的目的. 关于位带操作的博客说明有很多,这里主要将代码贴出来,并做详细的注释 /** ************

Duanxx的STM32学习:GPIO操作

STM32学习之路-不得不说的SysTick时钟

SysTick时钟,俗称"嘀嗒定时器",这家伙能按固定的时间产生一次中断,通常是多长时间产生一次中断呢?官方给出的一个时间是1ms 那么,它是怎么准确的产生1ms的呢.. 先来看看这家伙在时钟树的哪里吧 是它,是它,就是它,红色框里的东东,可以看到,它是由HCLK/8得到的,也就是:72MHz/8=9MHz 我们还能在STM32手册上找到这么一句话:系统嘀嗒校准值固定位9000,当系统嘀嗒时钟设为9MHz,产生1ms时间基准. 让我们来看看9000是怎么来的,这里要看下SysTick寄

STM32学习及应用笔记一:SysTick定时器学习及应用

这几年一直使用STM32的MCU,对ARM内核的SysTick计时器也经常使用,但几乎没有仔细了解过.最近正好要在移植一个新的操作系统时接触到了这块,据比较深入的了解了一下. 1.SysTick究竟是什么? 关于SysTick在STM32的资料中并没有详细的介绍,这可能由于SysTick是ARM内核的东西.在<STM32F10xxx参考手册>.<STM32F4xx参考手册>以及<STM32F7xx参考手册>中,介绍时钟的时候仅仅是在使用树上简单的画出了HCLK时钟经过8

STM32学习笔记——USART串口(向原子哥和火哥学习)

一.USART简介 通用同步异步收发器(USART)提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换.USART利用分数波特率发生器提供宽范围的波特率选择. STM32 的串口资源相当丰富的,功能也相当强劲.STM32F103ZET6 最多可提供 5 路串口,有分数波特率发生器,支持同步单向通信和半双工单线通信,支持LIN(局部互连网),智能卡协议和IrDA(红外数据组织)SIR ENDEC规范,以及调制解调器(CTS/RTS)操作.它还允许多处理器通信.

STM32学习笔记6(TIM通用模块生成PWM)

1.     TIMER输出PWM基本概念   脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术.简单一点,就是对脉冲宽度的控制.一般用来控制步进电机的速度等等. STM32的定时器除了TIM6和TIM7之外,其他的定时器都可以用来产生PWM输出,其中高级定时器TIM1和TIM8可以同时产生7路的PWM输出,而通用定时器也能同时产生4路的PWM输出. 1.1   PWM输出模式 S

STM32学习笔记(四)——串口控制LED(中断方式)

目录: 一.时钟使能,包括GPIO的时钟和串口的时钟使能 二.设置引脚复用映射 三.GPIO的初始化配置,注意要设置为复用模式 四.串口参数初始化配置 五.中断分组和中断优先级配置 六.设置串口中断类型并使能串口中断 七.编写中断服务函数函数名格式为函数名格式为 USARTxIRQHandler(x 对应串口号). 八.主函数的实现. 一.时钟使能,包括GPIO的时钟和串口的时钟使能 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); //

STM32学习笔记——OLED屏

STM32学习笔记--OLED屏 OLED屏的特点: 1.  模块有单色和双色可选,单色为纯蓝色,双色为黄蓝双色(本人选用双色): 2.  显示尺寸为0.96寸 3.  分辨率为128*64 4.  多种接口方式,该模块提供了总共 5 种接口包括: 6800. 8080 两种并行接口方式. 3线或4线的SPI接口,IIC接口方式 5.  不需要高压,直接接3.3V就可以工作:(可以与stm32的引脚直接相接) OLED图片: OLED引脚介绍: CS:OLED片选信号 RST:OLED复位端口