1. 配置 GPIO 时钟、串口时钟、复用时钟
2. 配置 GPIO 结构体
3. 配置串口
4. 配置中断 NVIC 抢占优先级
在 misc.h 头文件中查找相关函数函数
USART1_IRQn 在 stm32f10x.h 头文件中查找相关函数函数
NVIC_InitTypeDef nvicInitStructure
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2)
nvicInitStructure.NVIC_IRQChannel = USART1_IRQn;
nvicInitStructure.NVIC_IRQChannelPreemptionPriority = 1;
nvicInitStructure.NVIC_IRQChannelSubPriority = 1;
nvicInitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&nvicInitStructure);
5. 搭建串口中断服务函数
USART1_IRQHandler 在 startup_stm32f10x_hd.s 文件中查找
void USART1_IRQHandler(void)
{
char temp;
if( USART_GetITStatus(USART1, USART_IT_RXNE) != RESET )
{
temp=USART_ReceiveData(USART1);
if(temp=='O')
{
GPIO_ResetBits(GPIOC, GPIO_Pin_13);
USARTSendStr(USART1, "LED is open");
}
else if(temp=='C')
{
GPIO_SetBits(GPIOC, GPIO_Pin_13);
USARTSendStr(USART1, "LED is close");
}
}
}
用串口发送数据点亮LED
usart.c
#include "usart.h"
#include "stm32f10x.h"
void usart_init()
{
GPIO_InitTypeDef gpioInitStructure;
USART_InitTypeDef usartInitStructure;
NVIC_InitTypeDef nvicInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
gpioInitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
gpioInitStructure.GPIO_Pin = GPIO_Pin_9;
gpioInitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &gpioInitStructure);
gpioInitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
gpioInitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_Init(GPIOA, &gpioInitStructure);
usartInitStructure.USART_BaudRate = 115200;
usartInitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
usartInitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
usartInitStructure.USART_Parity = USART_Parity_No;
usartInitStructure.USART_StopBits = USART_StopBits_1;
usartInitStructure.USART_WordLength = USART_WordLength_8b;
USART_Init(USART1, &usartInitStructure);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
USART_Cmd(USART1, ENABLE);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
nvicInitStructure.NVIC_IRQChannel = USART1_IRQn;
nvicInitStructure.NVIC_IRQChannelPreemptionPriority = 1;
nvicInitStructure.NVIC_IRQChannelSubPriority = 1;
nvicInitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&nvicInitStructure);
}
void USARTSendByte(USART_TypeDef* USARTx, uint16_t Data)
{
USART_SendData( USARTx, Data);
while( USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET );
}
void USARTSendStr(USART_TypeDef* USARTx, char* str)
{
uint16_t i=0;
while( *(str+i) != '\0' )
{
USARTSendByte( USART1, *(str+i) );
i++;
}
while( USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET );
}
usart.h
#include "stm32f10x.h"
#include <stdio.h>
void usart_init(void);
void USARTSendByte(USART_TypeDef* USARTx, uint16_t Data);
void USARTSendStr(USART_TypeDef* USARTx, char* str);
main.c
#include "stm32f10x.h"
#include "main.h"
#include "led.h"
#include "shake.h"
#include "relay.h"
#include "exti.h"
#include "usart.h"
#include "tim.h"
void delay(uint16_t time)
{
uint16_t i=0;
while(time--)
{
i=10000;
while(i--);
}
}
int main()
{
LED_Init();
tim_Init();
GPIO_SetBits(GPIOC, GPIO_Pin_13);
while(1)
{
}
}
void USART1_IRQHandler(void)
{
char temp;
if( USART_GetITStatus(USART1, USART_IT_RXNE) != RESET )
{
temp=USART_ReceiveData(USART1);
if(temp=='O')
{
GPIO_ResetBits(GPIOC, GPIO_Pin_13);
USARTSendStr(USART1, "LED is open");
}
else if(temp=='C')
{
GPIO_SetBits(GPIOC, GPIO_Pin_13);
USARTSendStr(USART1, "LED is close");
}
}
}
点灯成功