笔者文笔拙劣,希望读者不要吐槽
首先进行一下基本的程序介绍,由于该程序是在我看了基本的IO操作和外部中断等操作之后写的,希望对自己和入门者有所帮助。现在这里只是粘贴程序,具体的操作介绍请看下一篇文章,介绍IO,外部中断和NVIC优先级管理,下面没有介绍EXTI15_10_IRQn的处理函数,这个函数很简单,所以没有介绍。
/*********************************************************************/
/****************************代码开始*********************************/
/*********************************************************************/
#include "stm32f10x.h"
#include <stdio.h>
void gpio_configuration(void)
{
GPIO_InitTypeDef GPIO_INITStructure;
GPIO_INITStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_INITStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_INITStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_INITStructure);
//
GPIO_INITStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_INITStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_INITStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_INITStructure);
GPIO_INITStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_INITStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_INITStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_INITStructure);
//配置输入端口,这里可以有两种方式,一种是
//扫描方式,一种是中断触发方式
//GPIO-8 9 10 11
GPIO_INITStructure.GPIO_Mode = GPIO_Mode_IPU;//配制成上拉输入
GPIO_INITStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_INITStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB , &GPIO_INITStructure);
GPIO_INITStructure.GPIO_Mode = GPIO_Mode_IPU;//配制成上拉输入
GPIO_INITStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_INITStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB , &GPIO_INITStructure);
GPIO_INITStructure.GPIO_Mode = GPIO_Mode_IPU;//配制成上拉输入
GPIO_INITStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_INITStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB , &GPIO_INITStructure);
GPIO_INITStructure.GPIO_Mode = GPIO_Mode_IPU;//配制成上拉输入
GPIO_INITStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_INITStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB , &GPIO_INITStructure);
}
void interrupt_init()
{
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_DeInit();
//初始化外部中断 8
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource8);
EXTI_InitStructure.EXTI_Line = EXTI_Line8;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_Init(&EXTI_InitStructure);
//初始化外部中断 9
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource9);
EXTI_InitStructure.EXTI_Line = EXTI_Line9;
EXTI_Init(&EXTI_InitStructure);
//初始化外部中断 10
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource10);
EXTI_InitStructure.EXTI_Line = EXTI_Line10;
EXTI_Init(&EXTI_InitStructure);
//初始化外部中断 11
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource11);
EXTI_InitStructure.EXTI_Line = EXTI_Line11;
EXTI_Init(&EXTI_InitStructure);
}
void UsartInit()
{
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate =115200u;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode =USART_Mode_Rx | USART_Mode_Tx;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_Init(USART1, &USART_InitStructure);
USART_ITConfig( USART1, USART_IT_RXNE, ENABLE);
USART_Cmd(USART1, ENABLE);
}
void NVICInit()
{
NVIC_InitTypeDef NVIC_INITStruture;
NVIC_INITStruture.NVIC_IRQChannel = USART1_IRQn;
NVIC_INITStruture.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_INITStruture.NVIC_IRQChannelSubPriority = 0;
NVIC_INITStruture.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_INITStruture);
NVIC_INITStruture.NVIC_IRQChannel = EXTI9_5_IRQn;
NVIC_INITStruture.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_INITStruture.NVIC_IRQChannelSubPriority = 0;
NVIC_INITStruture.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_INITStruture);
NVIC_INITStruture.NVIC_IRQChannel = EXTI15_10_IRQn;
NVIC_INITStruture.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_INITStruture.NVIC_IRQChannelSubPriority = 1;
NVIC_INITStruture.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_INITStruture);
}
u32 fac_us , fac_ms;
void delay_init(){
SysTick_CLKSourceConfig( SysTick_CLKSource_HCLK_Div8);
fac_us = SystemCoreClock/8000000;
fac_ms = fac_us*1000;
}
void delay_us(u32 nus)
{
u32 temp;
SysTick->LOAD = nus*fac_us;
SysTick->VAL = 0X00;
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
do{
temp = SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16)));
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;
SysTick->VAL = 0X00;
}
void delay_ms(u32 nms)
{
int i = 0;
for(i = 0; i < nms;i++)
{
delay_us(1000);
}
}
void delay(int delayms)
{
int i,j;
for(i = 0;i<100;i++)
{
for(j =0;j<72000;j++){
;
}
}
}
void my_sendbyte(u8 data)
{
while(RESET== USART_GetFlagStatus(USART1 , USART_FLAG_TXE));
USART_SendData(USART1 , data);
}
unsigned char key_value = 0;
void key_scan()
{
if(!GPIO_ReadInputDataBit( GPIOB,GPIO_Pin_8))
{
delay_ms(10);
if(!GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8)){
key_value = 1;
}
}
if(!GPIO_ReadInputDataBit( GPIOB,GPIO_Pin_9))
{
delay_ms(10);
if(!GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)){
key_value = 2;
}
}
if(!GPIO_ReadInputDataBit( GPIOB,GPIO_Pin_10))
{
delay_ms(10);
if(!GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10)){
key_value = 3;
}
}
if(!GPIO_ReadInputDataBit( GPIOB,GPIO_Pin_11))
{
delay_ms(10);
if(!GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)){
key_value = 4;
}
}
}
void screen_shadle(unsigned int shad)
{
delay_ms(shad);
my_sendbyte('a');
GPIO_SetBits(GPIOC, GPIO_Pin_8);
delay_ms(shad);
GPIO_ResetBits(GPIOC, GPIO_Pin_8);
}
int main(void)
{
u32 sys_clk = SystemCoreClock;
//打开时钟
RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC|RCC_APB2Periph_USART1,ENABLE);
gpio_configuration();
UsartInit();
NVICInit();
delay_init();
interrupt_init();
while (1)
{
// key_scan();
switch(key_value){
case 1:
screen_shadle(100);
break;
case 2:
screen_shadle(300);
break;
case 3:
screen_shadle(600);
break;
case 4:
screen_shadle(900);
break;
default:
key_value = 0;
break;
}
}
return 0;
}
/*********************************************************************/
/****************************代码结束*********************************/
/*********************************************************************/