STM32

笔者文笔拙劣,希望读者不要吐槽
首先进行一下基本的程序介绍,由于该程序是在我看了基本的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;
}
/*********************************************************************/
/****************************代码结束*********************************/
/*********************************************************************/

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值