项目概述:
源代码:
main.c
#include "stm32f10x.h"
#include "main.h"
#include "led.h"
#include "relay.h"
#include "shake.h"
#include "usart.h"
#include "exti.h"
void delay(uint16_t time)//延时函数
{
uint16_t i=0;
while(time--){
i=12000;
while(i--);
}
}
//结构体,接口pin 输出模式mode, 速率speed,在 gpio.C的gpio.h里
//GPIO初始化函数也在gpio.C的gpio.h里
int main()
{
//先到main(),然后到下面的函数,然后到对应的.h,然后.c文件
LED_Init();
//Relay_Init();
//Shake_Init();
//Exti_Init();
usart_init();
// printf("wwxstm32");
//putchar('9');
//GPIO_SetBits(GPIOA , GPIO_Pin_4);//初始化继电器为关闭状态, 与代码3有关
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(GPIOA , GPIO_Pin_1);
UsartSendStr(USART1,"LED IS OPEN");
}
if(temp == 'C')
{
GPIO_SetBits(GPIOA , GPIO_Pin_1);
UsartSendStr(USART1,"LED IS CLOSE");
}
}
}
main.h
#include "stm32f10x.h"
void delay(uint16_t time);
usart.c
#include "usart.h"
#include "stm32f10x.h"
void usart_init(void)
{
GPIO_InitTypeDef gpiostruct;//定义结构体变量
USART_InitTypeDef Usartstruct;//定义结构体变量
NVIC_InitTypeDef Nvicstruct;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
//配置时钟:GPIOA的时钟,串口的时钟,引脚复用的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
//配置GPIO的结构体 配置PA9 TX输出引脚
gpiostruct.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出
gpiostruct.GPIO_Pin = GPIO_Pin_9;//选定管脚为pA
gpiostruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&gpiostruct);//调用初始化函数
//配置PA10 RX输入引脚
gpiostruct.GPIO_Mode = GPIO_Mode_IN_FLOATING ;//浮空输入
gpiostruct.GPIO_Pin = GPIO_Pin_10;
//配置串口的结构体
GPIO_Init(GPIOA,&gpiostruct);
Usartstruct.USART_BaudRate = 115200;//波特率 配置波特率115200
Usartstruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//硬件流控制
Usartstruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//USART模式 配置工作模式 收或发
Usartstruct.USART_Parity = USART_Parity_No;//检验位
Usartstruct.USART_StopBits = USART_StopBits_1;//停止位
Usartstruct.USART_WordLength = USART_WordLength_8b;//字长 配置控制数据位的字长:八位
USART_Init(USART1, &Usartstruct);//调用初始化函数
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//中断配置函数
USART_Cmd(USART1, ENABLE);
Nvicstruct.NVIC_IRQChannel = USART1_IRQn;
Nvicstruct.NVIC_IRQChannelCmd = ENABLE;
Nvicstruct.NVIC_IRQChannelPreemptionPriority = 1;
Nvicstruct.NVIC_IRQChannelSubPriority = 1;
NVIC_Init(&Nvicstruct);
}
//串口的发送
//创建发送单个字符的函数UsartSendByte()
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;
do
{
UsartSendByte( USARTx, *(str + i));
i++;
}while( *(str + i) != '\0' );
while( USART_GetFlagStatus(USARTx,USART_FLAG_TC) == RESET );
}
int fputc(int ch,FILE *f)
{
USART_SendData(USART1, (uint8_t)ch);
while( USART_GetFlagStatus(USART1,USART_FLAG_TC) == RESET );
return (ch);
}
int fgetc(FILE *f)
{
while( USART_GetFlagStatus(USART1,USART_FLAG_RXNE) == RESET );
return (int) USART_ReceiveData(USART1);
}
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);
led.c
#include "led.h"
#include "stm32f10x.h"
void LED_Init(void){
GPIO_InitTypeDef led_init;
//使能apb2的gpioa,说人话就是打开这个gpioa
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
led_init.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出模式
led_init.GPIO_Pin = GPIO_Pin_1; //引脚为1看原理图
led_init.GPIO_Speed = GPIO_Speed_10MHz; //点灯 速率10mhz即可
GPIO_Init(GPIOA,&led_init);
}
led.h
#include "stm32f10x.h"
void LED_Init(void);
效果展示:
手动发送C,led2灯灭,同时串口发送led is close
手动发送O,led2灯亮,同时串口发送led is open