STM32F1学习笔记:keil编程套路整理

GPIO编程套路
一、配置GPIO口

  1. 使能管脚对应的GPIO组时钟
    RCC_APB2PeriphClockCmd( GPIOx, ENABLE);
  2. 定义一个初始化结构体型的变量
    GPIO_InitTypeDef GPIO_InitStructure;
  3. 对结构体变量的各成员赋值
    GPIO_InitStructure.GPIO_Pin =;
    GPIO_InitStructure.GPIO_Mode =;
    GPIO_InitStructure.GPIO_Speed =;
  4. 调用初始化函数,初始化GPIO
    GPIO_Init(GPIO_Pin_n, &GPIO_InitStructure);

二、在主函数中,调用GPIO函数编程。

UART编程套路
一、配置GPIO口及UART1口 (APB2, PA9, PA10管脚)

  1. 使能Tx、Rx管脚对应的GPIO组时钟,RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOx, ENABLE);
  2. 使能Tx、Rx管脚对应的UART时钟, RCC_APB2PeriphClockCmd(RCC_APB2Periph_ UARTx, ENABLE);
  3. 定义一个GPIO初始化结构体型的变量和一个UART初始化结构体变量
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
  4. 对GPIO初始化结构体变量的各成员赋值,设置GPIO为TX推挽复用输出模式,RX为浮空输入模式
    GPIO_InitStructure.GPIO_Pin =; GPIO_InitStructure.GPIO_Mode =; GPIO_InitStructure.GPIO_Speed =;
  5. 对UART初始化结构体变量各成员赋值,
    USART_InitStructure.USART_BaudRate =; USART_InitStructure.USART_WordLength =; USART_InitStructure.USART_StopBits =; USART_InitStructure.USART_Parity =;USART_InitStructure.USART_Mode =
  6. 调用初始化函数,初始化GPIO,GPIO_Init(GPIO_Pin_n, &GPIO_InitStructure);
  7. 调用初始化函数,初始化UART,USART_Init(USARTx, &USART_InitStructure);
  8. 配置串口中断优先级,使能串口中断,NVIC_Configuration(); USART_ITConfig(DEBUG_USARTx, USART_IT_RXNE, ENABLE);
  9. 使能串口,USART_Cmd(DEBUG_USARTx, ENABLE);

二、在stm32f10x_it.c中编写UART中断程序:
USART1_IRQHandler

三、在主函数中,完成其他功能编程。

说明:

  1. 使用UART需要将GPIO口配置为复用模式
  2. 使用UART需要同时打开GPIO口的时钟和UART的时钟。
  3. 如果使用UART中断,需要配置中断分组和中断优先级,并使能中断。
  4. 使用UART前,还需要使能UART串口通信。
  5. 单片机可以在程序中通过C标准库中的printf()函数向串口发送数据,但必须重定向到串口(因为C标准printf()函数是定向到屏幕,而不是串口)。
    格式:
///重定向c库函数printf到串口,重定向后可使用printf函数
int fputc(int ch, FILE *f) {
		/* 发送一个字节数据到串口 */
		USART_SendData(DEBUG_USARTx, (uint8_t) ch);
		/* 等待发送完毕 */
		while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET);	
		return (ch);
}

外部中断配置套路
①初始化GPIO

  1. 开启所有外部中断源管脚对应的GPIO时钟和AFIO时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOx|RCC_APB2Periph_AFIO, ENABLE)
  2. 定义GPIO初始化结构变量,
    GPIO_InitTypeDef GPIO_InitStructure;
  3. 赋值结构变量各成员
    GPIO_InitStructure.GPIO_Pin=管脚号0~15 ; .mode= GPIO_Mode_IN_FLOATING(浮空输入);
  4. 调用GPIO初始化函数:GPIO_Init(GPIO_PORT, & GPIO_InitStructure);
  5. 如果有多个中断源,重复步骤3~4。

②初始化NVIC;

  1. 设置优先级分组
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_n);
  2. 定义NVIC初始化结构变量,并赋值结构变量各成员
    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel =中断号;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =抢占优先级; NVIC_InitStructure.NVIC_IRQChannelSubPriority =子优先级;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  3. 调用NVIC初始化函数。
    NVIC_Init(&NVIC_InitStructure);
  4. 如果有多个中断源,重复步骤2~3。

③初始化EXTI

  1. 定义EXTI初始化结构变量
    EXTI_InitTypeDef EXTI_InitStructure;
  2. 选择EXTI的信号源(PA~PG),设置外部中断配置寄存器AFIO_EXTICR相关位
    GPIO_EXTILineConfig(GPIO_PORT, GPIO_PIN)
  3. 赋值结构变量各成员
    EXTI_InitStructure.EXTI_Line =信号源(0~15)
    EXTI_InitStructure.EXTI_Mode =中断模式(中断/事件)
    EXTI_InitStructure.EXTI_Trigger =触发方式(上升沿/下降沿)
  4. 调用EXTI初始化函数
    EXTI_Init(&EXTI_InitStructure);
    如果有多个外部中断源,重复步骤2~4.

④编写中断服务函数。
中断服务函数中,为确保确实产生了中断请求,通常需要检查一下状态标识位确认确实产生了该中断。同时,为避免一次中断请求执行多次中断服务程序,中断服务程序最后需要清除该中断标识位。例如:
if(EXTI_GetITStatus(KEY3_INT_EXTI_LINE) != RESET) //确保是否产生了EXTI Line中断
{…
EXTI_ClearITPendingBit(KEY3_INT_EXTI_LINE); //清除中断标志位
}

DMA编程套路

  1. 开启DMA控制器时钟:RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
  2. 定义初始化结构体变量:DMA_InitTypeDef DMA_InitStructure;
  3. 赋值结构体各成员变量:
DMA_InitStructure.DMA_PeripheralBaseAddr =; // 设置DMA源地址
DMA_InitStructure.DMA_MemoryBaseAddr = ;  // 设置内存地址
DMA_InitStructure.DMA_DIR =                              //DMA 方向
DMA_InitStructure.DMA_BufferSize =                   // 传输大小
DMA_InitStructure.DMA_PeripheralInc =              // 外设地址增长方式
DMA_InitStructure.DMA_MemoryInc =                // 内存地址增长方式
DMA_InitStructure.DMA_PeripheralDataSize =    // 外设数据单位,8、16、32	
DMA_InitStructure.DMA_MemoryDataSize =      // 内存数据单位
DMA_InitStructure.DMA_Mode =                         // DMA模式,一次或者循环模式
DMA_InitStructure.DMA_Priority =                      // 优先级:低、中、高、最高
DMA_InitStructure.DMA_M2M =                         // 是否启用内存到内存的传输,ENABLE/DISABLE
  1. 调用初始化函数: DMA_Init(USART_TX_DMA_CHANNEL, &DMA_InitStructure);
  2. DMA使能: DMA_Cmd (USART_TX_DMA_CHANNEL,ENABLE);
  3. 外设开启DMA请求(外设控制寄存器DMA允许位使能)

定时器编程套路
NVIC初始化
1、定义NVIC初始化结构体变量
2、设置中断分组
3、赋值初始化变量各成员
4、调用NVIC初始化函数
TIMx初始化
1、定义TIMx初始化结构体变量
2、开启定时器内部时钟
3、赋值初始化结构体变量各成员
4、调用TIMx初始化函数
5、开启定时器中断
6、使能定时器
中断响应函数编程

猜你喜欢

转载自blog.csdn.net/Chelsea_n/article/details/106898376