标题:
stm32呼吸灯程序
[打印本页]
作者:
嘤嘤嘤。
时间:
2020-4-29 13:19
标题:
stm32呼吸灯程序
#include "stm32f10x.h"
#include <stdio.h>
uint8_t senddata_buffer[12] = "QST_DMA_TEST";
void delay(void)
{
uint32_t volatile cnt = 0xFFFFF;
while(cnt--);
}
void led_init(void)
{
GPIO_InitTypeDef GPIO_InitStruct; // 定义GPIO初始化结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 开启GPIOB的时钟
// PB5->LED
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5; // 选择第5个引脚进行设置
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; // 设置该引脚为通用推挽输出模式
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; // 设置该引脚的输出频率为50MHz
GPIO_Init(GPIOB, &GPIO_InitStruct); // 对该引脚进行初始化
GPIO_SetBits(GPIOB, GPIO_Pin_5); // LED OFF
}
void nvic_init(void)
{
NVIC_InitTypeDef NVIC_InitStruct; // 定义NVIC初始化结构体
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); // 中断优先级分组1
//配置EXIT0中断
NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn; // 设置EXTI0中断
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0; // 抢占优先级设置为0
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2; // 子优先级设置为2
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; // 开启EXTI0中断
NVIC_Init(&NVIC_InitStruct); // 对EXTI0中断进行初始化
//配置USART1中断
NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn; // 设置USART1中断
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级设置为0
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1; // 子优先级设置为1
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; // 开启USART1中断
NVIC_Init(&NVIC_InitStruct); // 对USART1中断进行
//配置TIM3中断
NVIC_InitStruct.NVIC_IRQChannel = TIM6_IRQn; // 设置TIM6中断
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级设置为0
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0; // 子优先级设置为0
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; // 开启TIM6中断
NVIC_Init(&NVIC_InitStruct); // 对TIM6中断
//配置TIM3中断
NVIC_InitStruct.NVIC_IRQChannel = TIM3_IRQn; // 设置TIM6中断
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级设置为0
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 3; // 子优先级设置为3
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; // 开启TIM6中断
NVIC_Init(&NVIC_InitStruct); // 对TIM6中断
}
void exti_init(void)
{
GPIO_InitTypeDef GPIO_InitStruct; // 定义GPIO初始化结构体
EXTI_InitTypeDef EXTI_InitStruct; // 定义EXTI初始化结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); // 开启GPIOA和AFIO的时钟
// PA0->Key
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; // 选择第0个引脚进行设置
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; // 设置该引脚为浮空输入模式
GPIO_Init(GPIOA, &GPIO_InitStruct); // 对该引脚进行初始化
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); // PA0->EXTILine0
EXTI_InitStruct.EXTI_Line = EXTI_Line0; // 选择外部中断线0
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt; // 设置EXTILine0为中断模式
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling; // 设置触发方式为上升沿触发
EXTI_InitStruct.EXTI_LineCmd = ENABLE; // 开启EXTILine0
EXTI_Init(&EXTI_InitStruct); // 对EXTILine0进行初始化
}
void usart_init(void)
{
USART_InitTypeDef USART_InitStruct; // 定义USART初始化结构体
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); // 开启USART1的时钟
// PA9->Tx
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9; // 选择第9个引脚进行设置
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; // 设置该引脚为复用推挽输出
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; // 设置该引脚输出速率为50MHz
GPIO_Init(GPIOA, &GPIO_InitStruct); // 对该引脚进行初始化
// PA10->Rx
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10; // 选择第10个引脚进行配置
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; // 设置该引脚为浮空输入模式
GPIO_Init(GPIOA, &GPIO_InitStruct); // 对该引脚进行初始化
// USART1配置
USART_InitStruct.USART_BaudRate = 115200; // 设置波特率为115200
USART_InitStruct.USART_WordLength = USART_WordLength_8b;// 设置数据位为8位
USART_InitStruct.USART_Parity = USART_Parity_No; // 不使用校验位
USART_InitStruct.USART_StopBits = USART_StopBits_1; // 设置1位停止位
USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;// 关闭硬件流控制
USART_InitStruct.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; // 开启发送和接收功能
USART_Init(USART1, &USART_InitStruct); // 对USART1进行初始化
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); // 开启USART1的接受中断
USART_Cmd(USART1, ENABLE); // 开启USART1
}
// USART1发送字节函数
void usart1_sendbyte(char sendbyte)
{
USART_SendData(USART1, sendbyte); // 发送一个字节
while(!USART_GetFlagStatus(USART1, USART_FLAG_TXE));// 等待数据寄存器为空
}
// USART1发送字符串函数
void usart1_sendstring(char *sendstring)
{
uint8_t cnt = 0;
do
{
usart1_sendbyte(*(sendstring + cnt));
cnt++;
}
while(*(sendstring + cnt) != '\0'); // 发送字符串
while(!USART_GetFlagStatus(USART1, USART_FLAG_TC)); // 判断字符串是否发送完成
}
void tim_init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;//定义定时器时基初始化结构体
TIM_OCInitTypeDef TIM_OCInitStruct;//定义输出比较初始化结构体
GPIO_InitTypeDef GPIO_InitStruct;//定义GPIO初始化结构体
//TIM6配置
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6 | RCC_APB1Periph_TIM3,ENABLE);//开启TIM6和TIM3的时钟
TIM_TimeBaseStruct.TIM_Prescaler = (7200 - 1);
TIM_TimeBaseStruct.TIM_Period = (10000 - 1);
TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up;//设置定时器计数模式
TIM_TimeBaseStruct.TIM_ClockDivision = TIM_CKD_DIV1;//设置时钟分隔
TIM_TimeBaseStruct.TIM_RepetitionCounter = 0;//设置时钟重复为0
TIM_TimeBaseInit(TIM6,&TIM_TimeBaseStruct);//设置初始化
TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE);
TIM_Cmd(TIM6,ENABLE);
//TIM3配置,PB0->TIM3_CH3 PWM
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStruct);
//TIM3时基部分
TIM_TimeBaseStruct.TIM_Prescaler = (72 - 1);
TIM_TimeBaseStruct.TIM_Period = (100 - 1);//10KMZ
TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up;//设置定时器计数模式
TIM_TimeBaseStruct.TIM_ClockDivision = TIM_CKD_DIV1;//设置时钟分隔,不分频
TIM_TimeBaseStruct.TIM_RepetitionCounter = 0;//设置时钟重复为0
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStruct);//设置初始化
//TIM3输出比较部分
TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;//PWM模式
TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_Low;
TIM_OCInitStruct.TIM_Pulse = 0;
TIM_OC3Init(TIM3,&TIM_OCInitStruct);//对TIM3的CH3初始化
TIM_OC3PreloadConfig(TIM3,TIM_OCPreload_Enable);//开启TIM3的预加载寄存器
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//开启TIM3的中断
TIM_Cmd(TIM3,ENABLE);//开启TIM3
}
//void dma_init(void)
//{
// DMA_InitTypeDef DMA_InitStuct;
// RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);//开启DMA1时钟
// DMA_InitStuct.DMA_PeripheralBaseAddr = USART1_BASE+0x04;/*(uint32_t)USART1->DR; *///指定外设地址
// DMA_InitStuct.DMA_MemoryBaseAddr = (uint32_t)senddata_buffer;//指定存储器地址
// DMA_InitStuct.DMA_DIR = DMA_DIR_PeripheralDST;
// DMA_InitStuct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
// DMA_InitStuct.DMA_MemoryInc = DMA_MemoryInc_Enable;
// DMA_InitStuct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
// DMA_InitStuct.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
// DMA_InitStuct.DMA_BufferSize = 12;
// DMA_InitStuct.DMA_Mode = DMA_Mode_Normal;
// DMA_InitStuct.DMA_Priority = DMA_Priority_High;
// DMA_InitStuct.DMA_M2M = DMA_M2M_Disable;
// DMA_Init(DMA1_Channel4,&DMA_InitStuct);
// DMA_Cmd(DMA1_Channel4,ENABLE);
//}
/**
* @brief Main program.
* @param None
* @retval None
*/
int main(void)
{
led_init(); // LED初始化函数
nvic_init(); // NVIC配置函数
exti_init(); // EXTI配置函数
usart_init(); // USART配置函数
tim_init(); //TIM配置函数
// dma_init(); //DMA配置函数
// USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);//USART1向DMA1发送T请求
// usart1_sendstring("This is a testing\n");
// usart1_sendstring("Hello STM32\n");
/* Infinite loop */
while (1)
{
// GPIO_ResetBits(GPIOB, GPIO_Pin_5); // LED ON
// delay();
// GPIO_SetBits(GPIOB, GPIO_Pin_5); // LED OFF
// delay();
}
}
复制代码
4.27.7z
2020-4-29 18:15 上传
点击文件名下载附件
下载积分: 黑币 -5
177.75 KB, 下载次数: 17, 下载积分: 黑币 -5
stm32f103野火开发板
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1