本人做这个编写不出来,希望有朋友帮助啦
配置串口1波特率为115200,pc14为推挽输出。
上电后pc14为高电平,串口每2秒输出一次0x00;
当单片机收到0x01时,串口每2秒输出一次0x01并将pc14设置为低电平;
当单片机收到0x00时,串口每2秒输出一次0x00并将pc14设置为高电平。
本人做这个编写不出来,希望有朋友帮助啦
配置串口1波特率为115200,pc14为推挽输出。
上电后pc14为高电平,串口每2秒输出一次0x00;
当单片机收到0x01时,串口每2秒输出一次0x01并将pc14设置为低电平;
当单片机收到0x00时,串口每2秒输出一次0x00并将pc14设置为高电平。
#include "stm32f10x.h"
#include "stm32f10x_usart.h"
/******************************* Usart1 *************************/
// USART1初始化
// PA 9 tx
// PA10 rx
void Usart1_Init(u32 baurdrate)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
/* 使能 USART1 时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);
/* USART1 使用IO端口配置 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIOA
/* USART1 工作模式配置 */
USART_InitStructure.USART_BaudRate = baurdrate; //波特率设置
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //数据位数设置:8位
USART_InitStructure.USART_StopBits = USART_StopBits_1; //停止位设置:1位
USART_InitStructure.USART_Parity = USART_Parity_No ; //是否奇偶校验:无
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //硬件流控制模式设置:没有使能
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//接收与发送都使能
USART_Init(USART1, &USART_InitStructure); //初始化USART1
USART_Cmd(USART1, ENABLE);// USART1使能
}
/*发送一个字节数据*/
void Uart1SendByte(unsigned char SendData)
{
USART_SendData(USART1,SendData);
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
}
/*接收一个字节数据*/
unsigned char UART1GetByte(unsigned char* GetData)
{
if(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET)
{
return 0;//没有收到数据
}
*GetData = USART_ReceiveData(USART1);
return 1;//收到数据
}
#include "stm32f10x.h"
#include "stm32f10x_tim.h"
#include "stm32f10x_it.h"
// 使用定时器3定时
// 系统时钟 72M : psc : 7199 pre: 2000 0
// 系统时钟 84M : psc : 8399 pre: 2000 0
//Tout = (pre) * (psc+1)/Tclk; //psc会自动加1
void TIM3_init(u16 pre,u16 psc){ //定时器是16位的
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//定义定时器变量
NVIC_InitTypeDef NVIC_InitStructure;//NVIC中断优先级配置
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//使能定时器时钟
//初始化定时器参数:自动重装载值,分频系数,计数方式等
TIM_TimeBaseInitStructure.TIM_Period=pre ;//自动重载值
TIM_TimeBaseInitStructure.TIM_Prescaler = psc ;//预分频系数
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1; //采样设置 ,1分频即不分频
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//计数模式
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);//定时器初始化函数
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//定时器中断类型选择,使能(更新中断)
//NVIC的配置
//要配置中断分组(main中)
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//防止定时器状态在计数时已经置位 //清空状态
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);//清除中断标志位
//开启定时器
TIM_Cmd(TIM3,ENABLE);
}
//定时器3 中断服务函数
void TIM3_IRQHandler(void){
if(TIM_GetITStatus(TIM3,TIM_IT_Update)){ //这个函数会先判断是否发送中断,然后再获取中断标志
if( data == 0x00 ){
Uart1SendByte(0x00);
}else if(data == 0x01){
Uart1SendByte(0x01);
}
}
//清除中断标志(调用函数,或者读取相应寄存器中的值,标志会自动清除)
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
}
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
void PC14Init(void){
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC , ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
u8 data = 0;
int main(void){
PC14Init();
TIM3_init(20000,7199);
Usart1_Init(115200);
while(1){
UART1GetByte(&data);
if( data == 0x00 ){
GPIO_WriteBit(GPIOC,GPIO_Pin_14,Bit_SET);
}else if(data == 0x01){
GPIO_WriteBit(GPIOC,GPIO_Pin_14,Bit_RESET);
}
}
}