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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2587|回復: 0
收起左側

基于STM32F103VE實現呼吸燈源程序

[復制鏈接]
ID:585660 發表于 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初始化結構體
        
                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
        
                // EXTI0中斷配置
                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中斷進行初始化
        
                // TIM6中斷配置
                NVIC_InitStruct.NVIC_IRQChannel = TIM6_IRQn;                                                // 設置TIM6中斷
                NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;        // 搶占優先級設置為0
                NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;                                        // 子優先級設置為1
                NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;                                                // 開啟TIM6中斷
                NVIC_Init(&NVIC_InitStruct);                                                                                                                // 對TIM6中斷進行初始化
               
                // 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初始化結構體
                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;                                                                                        // 定義GPIO初始化結構體
        
                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初始化結構體
        
                RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6 | RCC_APB1Periph_TIM3, ENABLE); // 開啟TIM6和TIM3的時鐘
        
                // TIM6配置
                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;
                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); // 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);                // 對TIM3的CH3進行初始化
                TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable); // 開啟TIM3的預加載寄存器
               
                TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); // 開啟TIM3的中斷
               
                TIM_Cmd(TIM3, ENABLE); // 開啟TIM3
               
}

/**
  * @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配置函數
        
        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中斷服務函數
void EXTI0_IRQHandler(void)
{
                if(EXTI_GetITStatus(EXTI_Line0) != RESET) // 確保相應中斷發生了
                {
                                EXTI_ClearITPendingBit(EXTI_Line0);                // 清除EXTI0中斷標志位
                                
                                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) // 確保相應的中斷發生
                {
                                USART_ClearITPendingBit(USART1, USART_IT_RXNE);                // 清除USART1接收中斷位
                        
                                rcv_data = USART_ReceiveData(USART1);                                                        // 接收數據
//                                usart1_sendbyte(rcv_data);                                                                                                // 發送數據
                                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中斷服務函數
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中斷服務函數
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, 下載次數: 21, 下載積分: 黑幣 -5

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品色 | 青青久草 | 野狼在线社区2017入口 | 欧美成年网站 | 精品区一区二区 | 成人免费视频网站在线看 | 日韩免费在线 | 伊人久久综合影院 | 成人综合一区二区 | 成人一区精品 | 91精品国产一区二区三区 | 伊人青青久久 | 国产在线一区二区 | 久一精品 | 无吗视频 | 91精品国产综合久久精品图片 | 国产欧美日韩一区二区三区 | 精品国产乱码一区二区三区 | 国产一二三区精品视频 | 97色在线视频 | 久草视频在线播放 | 一区二区三区四区在线免费观看 | 91精产国品一二三区 | 国产一区久久久 | www.久| 成人国产一区二区三区精品麻豆 | av黄色免费在线观看 | 欧美成人一区二区三区 | 国产色 | 国产精品美女久久久免费 | 日韩欧美大片 | 九色 在线| 欧美三级电影在线播放 | 日本精品一区 | 日韩精品免费视频 | 婷婷免费视频 | 国产日韩欧美 | 波多野结衣一区二区 | 激情欧美一区二区三区中文字幕 | 日本在线网站 | 久久久久久中文字幕 |