|
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;
}
}
}
}
|
評(píng)分
-
查看全部評(píng)分
|