要用什么函数才能在stm32f103c8t6上给GPIO配置外部中断的时钟并且能够实现隔10ms进入一次中断
时间: 2023-06-10 20:08:58 浏览: 51
在使用GPIO外部中断之前,需要先开启GPIO时钟和外部中断时钟。开启GPIO时钟可以使用RCC(Reset and Clock Control)寄存器,开启外部中断时钟可以使用NVIC(Nested Vectored Interrupt Controller)寄存器。
以下是配置GPIO外部中断时钟的代码示例:
```c
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOx, ENABLE); // x为外部中断所在的GPIO端口,如GPIOA、GPIOB等
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); // 开启AFIO时钟
```
以上代码中,使用了RCC_APB2PeriphClockCmd函数来开启GPIO外设和AFIO(Alternate Function Input/Output)时钟。AFIO模块用于管理外设的复用功能,它可以使得某些GPIO引脚可以同时被多个外设使用。
接下来需要在程序中设置定时器,以便在一定时间间隔后触发中断。可以使用STM32的SysTick定时器,它是一个24位的计数器,每1个SysTick时钟周期会自动减1。
以下是在SysTick定时器中配置10ms定时器的代码示例:
```c
void SysTick_Init(void)
{
SysTick->CTRL &= ~(SysTick_CTRL_ENABLE_Msk); // 关闭SysTick计数器
SysTick->LOAD = SystemCoreClock/100 - 1; // 设置计数器重载值,SystemCoreClock为系统时钟频率
SysTick->VAL = 0; // 清空计数器
SysTick->CTRL |= SysTick_CTRL_CLKSOURCE_Msk; // 使用系统时钟作为计数器时钟源
SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk; // 允许SysTick定时器中断
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; // 开启SysTick计数器
}
```
以上代码中,使用了SysTick_CTRL_ENABLE_Msk、SysTick_CTRL_CLKSOURCE_Msk、SysTick_CTRL_TICKINT_Msk这三个宏来设置SysTick计时器的相关参数。计数器重载值的计算公式为:重载值 = 系统时钟频率 / 定时器周期 - 1。
在每次中断触发时,需要将GPIO引脚状态取反,以实现简单的闪烁效果。以下是在GPIO外部中断服务函数中实现GPIO引脚取反的代码示例:
```c
void EXTIx_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_LineX) != RESET) // 判断是否为外部中断X
{
GPIO_WriteBit(GPIOx, GPIO_PinX, (BitAction)(1-GPIO_ReadInputDataBit(GPIOx, GPIO_PinX))); // GPIO引脚状态取反
EXTI_ClearITPendingBit(EXTI_LineX); // 清除中断标志位
}
}
```
以上代码中,使用了GPIO_WriteBit函数来将GPIO引脚状态取反,使用了EXTI_ClearITPendingBit函数来清除中断标志位。需要注意的是,此处的GPIOx、GPIO_PinX、EXTI_LineX需要根据实际硬件连接情况进行修改。
最后,在main函数中需要调用SysTick_Init函数和NVIC_EnableIRQ函数来初始化SysTick定时器和开启GPIO外部中断:
```c
int main(void)
{
SysTick_Init(); // 初始化SysTick定时器
NVIC_EnableIRQ(EXTIx_IRQn); // 开启外部中断X中断
while(1);
}
```
以上是在stm32f103c8t6上给GPIO配置外部中断的时钟并且能够实现隔10ms进入一次中断的基本流程,具体实现还需要根据实际情况进行修改。