久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2568|回復(fù): 0
收起左側(cè)

基于STM32F103VE實(shí)現(xiàn)呼吸燈源程序

[復(fù)制鏈接]
ID:585660 發(fā)表于 2020-6-9 16:59 | 顯示全部樓層 |閱讀模式
mian.c:
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include <stdio.h>

void delay(void)
{
                uint32_t volatile cnt = 0xFFFFF;
                while(cnt--);
}

void led_init(void)
{
                GPIO_InitTypeDef GPIO_InitStruct;                                                                         // 定義GPIO初始化結(jié)構(gòu)體
        
                RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 開(kāi)啟GPIOB的時(shí)鐘
        
                // PB5->LED
                GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5;                                                         // 選擇第5個(gè)引腳進(jìn)行設(shè)置
                GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;                         // 設(shè)置該引腳為通用推挽輸出模式
                GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;                        // 設(shè)置該引腳的輸出頻率為50MHz
                GPIO_Init(GPIOB, &GPIO_InitStruct);                                                                        // 對(duì)該引腳進(jìn)行初始化
                GPIO_SetBits(GPIOB, GPIO_Pin_5);                                                                                 // LED OFF
}

void nvic_init(void)
{
                NVIC_InitTypeDef NVIC_InitStruct;                                                                                // 定義NVIC初始化結(jié)構(gòu)體
        
                NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);                        // 中斷優(yōu)先級(jí)分組1
        
                // EXTI0中斷配置
                NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;                                                // 設(shè)置EXTI0中斷
                NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;        // 搶占優(yōu)先級(jí)設(shè)置為0
                NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2;                                        // 子優(yōu)先級(jí)設(shè)置為2
                NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;                                                // 開(kāi)啟EXTI0中斷
                NVIC_Init(&NVIC_InitStruct);                                                                                                                // 對(duì)EXTI0中斷進(jìn)行初始化
               
                // USART1中斷配置
                NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn;                                        // 設(shè)置USART1中斷
                NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;        // 搶占優(yōu)先級(jí)設(shè)置為0
                NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;                                        // 子優(yōu)先級(jí)設(shè)置為1
                NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;                                                // 開(kāi)啟USART1中斷
                NVIC_Init(&NVIC_InitStruct);                                                                                                                // 對(duì)USART1中斷進(jìn)行初始化
        
                // TIM6中斷配置
                NVIC_InitStruct.NVIC_IRQChannel = TIM6_IRQn;                                                // 設(shè)置TIM6中斷
                NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;        // 搶占優(yōu)先級(jí)設(shè)置為0
                NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;                                        // 子優(yōu)先級(jí)設(shè)置為1
                NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;                                                // 開(kāi)啟TIM6中斷
                NVIC_Init(&NVIC_InitStruct);                                                                                                                // 對(duì)TIM6中斷進(jìn)行初始化
               
                // TIM3中斷配置
                NVIC_InitStruct.NVIC_IRQChannel = TIM3_IRQn;
                NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
                NVIC_InitStruct.NVIC_IRQChannelSubPriority = 3;
                NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
                NVIC_Init(&NVIC_InitStruct);
}

void exti_init(void)
{
                GPIO_InitTypeDef GPIO_InitStruct;                                                                         // 定義GPIO初始化結(jié)構(gòu)體
                EXTI_InitTypeDef EXTI_InitStruct;                                                                                // 定義EXTI初始化結(jié)構(gòu)體
        
                RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); // 開(kāi)啟GPIOA和AFIO的時(shí)鐘
        
                // PA0->Key
                GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;                                                        // 選擇第0個(gè)引腳進(jìn)行設(shè)置
                GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;        // 設(shè)置該引腳為浮空輸入模式
                GPIO_Init(GPIOA, &GPIO_InitStruct);                                                                        // 對(duì)該引腳進(jìn)行初始化
               
                GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); // PA0->EXTILine0
                EXTI_InitStruct.EXTI_Line = EXTI_Line0;                                                        // 選擇外部中斷線(xiàn)0
                EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;                // 設(shè)置EXTILine0為中斷模式
                EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling;        // 設(shè)置觸發(fā)方式為上升沿觸發(fā)
                EXTI_InitStruct.EXTI_LineCmd = ENABLE;                                                        // 開(kāi)啟EXTILine0
                EXTI_Init(&EXTI_InitStruct);                                                                                                // 對(duì)EXTILine0進(jìn)行初始化
}

void usart_init(void)
{
                USART_InitTypeDef USART_InitStruct;                                                                                        // 定義USART初始化結(jié)構(gòu)體
                GPIO_InitTypeDef  GPIO_InitStruct;                                                                                        // 定義GPIO初始化結(jié)構(gòu)體
        
                RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);        // 開(kāi)啟USART1的時(shí)鐘
        
                // PA9->Tx
                GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;                                                                        // 選擇第9個(gè)引腳進(jìn)行設(shè)置
                GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;                                                // 設(shè)置該引腳為復(fù)用推挽輸出
                GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;                                        // 設(shè)置該引腳輸出速率為50MHz
                GPIO_Init(GPIOA, &GPIO_InitStruct);                                                                                        // 對(duì)該引腳進(jìn)行初始化
        
                // PA10->Rx
                GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;                                                                        // 選擇第10個(gè)引腳進(jìn)行配置
                GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;                        // 設(shè)置該引腳為浮空輸入模式
                GPIO_Init(GPIOA, &GPIO_InitStruct);                                                                                        // 對(duì)該引腳進(jìn)行初始化
        
                // USART1配置
                USART_InitStruct.USART_BaudRate = 115200;                                                                // 設(shè)置波特率為115200
                USART_InitStruct.USART_WordLength = USART_WordLength_8b;// 設(shè)置數(shù)據(jù)位為8位
                USART_InitStruct.USART_Parity = USART_Parity_No;                                // 不使用校驗(yàn)位
                USART_InitStruct.USART_StopBits = USART_StopBits_1;                        // 設(shè)置1位停止位
                USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;// 關(guān)閉硬件流控制
                USART_InitStruct.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; // 開(kāi)啟發(fā)送和接收功能
                USART_Init(USART1, &USART_InitStruct);                                                                        // 對(duì)USART1進(jìn)行初始化
               
                USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);                                        // 開(kāi)啟USART1的接收中斷
               
                USART_Cmd(USART1, ENABLE);                                                                                                                        // 開(kāi)啟USART1

}

// USART1發(fā)送字節(jié)函數(shù)
void usart1_sendbyte(char sendbyte)
{
                USART_SendData(USART1, sendbyte);                                                                                                                // 發(fā)送一個(gè)字節(jié)
                while(!USART_GetFlagStatus(USART1, USART_FLAG_TXE));                                // 等待數(shù)據(jù)寄存器為空
}

// USART1發(fā)送字符串函數(shù)
void usart1_sendstring(char *sendstring)
{
                uint8_t cnt = 0;
                do
                {
                                usart1_sendbyte(*(sendstring + cnt));
                                cnt++;
                }
                while(*(sendstring + cnt) != '\0');                        // 發(fā)送字符串
               
                while(!USART_GetFlagStatus(USART1, USART_FLAG_TC)); // 判斷字符串是否發(fā)送完成
}

void tim_init(void)
{
                TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;                        // 定義定時(shí)器時(shí)基初始化結(jié)構(gòu)體
                TIM_OCInitTypeDef TIM_OCInitStruct;                                                                        // 定義輸出比較初始化結(jié)構(gòu)體
                GPIO_InitTypeDef        GPIO_InitStruct;                                                        // 定義GPIO初始化結(jié)構(gòu)體
        
                RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6 | RCC_APB1Periph_TIM3, ENABLE); // 開(kāi)啟TIM6和TIM3的時(shí)鐘
        
                // TIM6配置
                TIM_TimeBaseStruct.TIM_Prescaler = (7200 - 1);
                TIM_TimeBaseStruct.TIM_Period = (10000 - 1);
                TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up;        // 設(shè)置定時(shí)器計(jì)數(shù)模式
                TIM_TimeBaseStruct.TIM_ClockDivision = TIM_CKD_DIV1;
                TIM_TimeBaseStruct.TIM_RepetitionCounter = 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時(shí)基部分
                TIM_TimeBaseStruct.TIM_Prescaler = (72 - 1);
                TIM_TimeBaseStruct.TIM_Period = (100 - 1); // 10KHz
                TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up;
                TIM_TimeBaseStruct.TIM_ClockDivision = TIM_CKD_DIV1;
                TIM_TimeBaseStruct.TIM_RepetitionCounter = 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);                // 對(duì)TIM3的CH3進(jìn)行初始化
                TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable); // 開(kāi)啟TIM3的預(yù)加載寄存器
               
                TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); // 開(kāi)啟TIM3的中斷
               
                TIM_Cmd(TIM3, ENABLE); // 開(kāi)啟TIM3
               
}

/**
  * @brief  Main program.
  * @param  None
  * @retval None
  */
int main(void)
{
        led_init();         // LED初始化函數(shù)
        nvic_init();        // NVIC配置函數(shù)
        exti_init();        // EXTI配置函數(shù)
        usart_init();        // USART配置函數(shù)
        tim_init();                // TIM配置函數(shù)
        
        usart1_sendstring("This is a testing\n");
        usart1_sendstring("Hello STM32\n");

  /* Infinite loop */
  while (1)
  {
  }
}
/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/

it.c:
// EXTI0中斷服務(wù)函數(shù)
void EXTI0_IRQHandler(void)
{
                if(EXTI_GetITStatus(EXTI_Line0) != RESET) // 確保相應(yīng)中斷發(fā)生了
                {
                                EXTI_ClearITPendingBit(EXTI_Line0);                // 清除EXTI0中斷標(biāo)志位
                                
                                if(GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_5) == 0) // 判斷LED引腳電平是否為0
                                {
                                                GPIO_SetBits(GPIOB, GPIO_Pin_5);                // LED OFF
                                }
                                else // GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_5) == 1
                                {
                                                GPIO_ResetBits(GPIOB, GPIO_Pin_5);        // LED ON
                                }
                }
}

uint8_t rx_buffer_flag = 0;
uint8_t rx_buffer[5] = {0};
uint8_t rx_buffer_cnt = 0;
void USART1_IRQHandler(void)
{
                uint8_t rcv_data = 0;
                if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) // 確保相應(yīng)的中斷發(fā)生
                {
                                USART_ClearITPendingBit(USART1, USART_IT_RXNE);                // 清除USART1接收中斷位
                        
                                rcv_data = USART_ReceiveData(USART1);                                                        // 接收數(shù)據(jù)
//                                usart1_sendbyte(rcv_data);                                                                                                // 發(fā)送數(shù)據(jù)
                                if(rcv_data == 0xAA)
                                {
                                                rx_buffer_flag = 1;
                                }
                                if(rx_buffer_flag == 1)
                                {
                                                rx_buffer[rx_buffer_cnt] = rcv_data;
                                                rx_buffer_cnt++;
                                }
                                if(rx_buffer_cnt >= 4)
                                {
                                                rx_buffer_flag = 0;
                                                rx_buffer[4] = '\0';
                                                usart1_sendstring((char *)(rx_buffer + 1));
                                                rx_buffer_cnt = 0;
                                }
                                
                }
}

// TIM6中斷服務(wù)函數(shù)
void TIM6_IRQHandler(void)
{
                if(TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET)
                {
                                TIM_ClearITPendingBit(TIM6, TIM_IT_Update);
                        
//                                if(GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_5) == 0) // 判斷LED引腳電平是否為0
//                                {
//                                                GPIO_SetBits(GPIOB, GPIO_Pin_5);                // LED OFF
//                                }
//                                else // GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_5) == 1
//                                {
//                                                GPIO_ResetBits(GPIOB, GPIO_Pin_5);        // LED ON
//                                }
                }
}

// TIM3中斷服務(wù)函數(shù)
uint8_t cnt1 = 0;
uint8_t cnt2 = 0;
uint8_t cnt_flag = 0;
void TIM3_IRQHandler(void)
{
                if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
                {
                                TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
                        
                                cnt1++;
                                if(cnt1 >= 100)
                                {
                                                cnt1 = 0;
                                                TIM3->CCR3 = cnt2;
                                                if(cnt_flag == 0)
                                                {
                                                                cnt2++;
                                                }
                                                else
                                                {
                                                                cnt2--;
                                                }
                                                if(cnt2 >= 100)
                                                {
                                                                cnt_flag = 1;
                                                }
                                                else if(cnt2 == 0)
                                                {
                                                                cnt_flag = 0;
                                                }
                                }
               
                }

}


stm32_test_20200417_呼吸燈.7z

176.35 KB, 下載次數(shù): 21, 下載積分: 黑幣 -5

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产精品久久免费观看 | 亚洲视频免费在线播放 | 日韩一二区 | 天天综合网天天综合 | 国产一级免费视频 | 国产黄色麻豆视频 | 欧美不卡一区二区三区 | 国产一区二区三区在线 | 亚洲精品一 | 日本精品一区二区三区视频 | 亚洲欧美成人在线 | 啪啪免费网 | 成人免费网站 | 精品在线一区 | 一区二区三区回区在观看免费视频 | 国产一级片在线播放 | www精品| 99久久精品国产一区二区三区 | 中文字幕在线看人 | 日日噜 | 成人免费淫片aa视频免费 | 日本一区二区影视 | 红色av社区| 一级毛片免费完整视频 | 米奇狠狠鲁| 一级片网站视频 | 97在线观视频免费观看 | 久久99久久99| 区一区二区三在线观看 | 国产一区二区三区色淫影院 | 视频在线一区 | 精品免费国产一区二区三区四区介绍 | www.久久久久久久久久久 | av在线视 | 成人欧美一区二区三区在线播放 | 麻豆av片 | 国产99免费视频 | 国产亚洲精品久久午夜玫瑰园 | a级在线| 欧美亚洲国产日韩 | 中国一级特黄真人毛片 |