完整版STM32F103通用教程.docx
《完整版STM32F103通用教程.docx》由会员分享,可在线阅读,更多相关《完整版STM32F103通用教程.docx(11页珍藏版)》请在冰豆网上搜索。
![完整版STM32F103通用教程.docx](https://file1.bdocx.com/fileroot1/2022-10/24/c5908bb5-a30a-42a5-a4b7-851e2e2d3a28/c5908bb5-a30a-42a5-a4b7-851e2e2d3a281.gif)
完整版STM32F103通用教程
STM32F103_使用心得
IO端口输入输出模式设置:
...........;
Delay延时函数:
..............;
IO端口使用总结:
...............;
IO口时钟配置:
................;
初始化IO口参数:
...............;
注意:
时钟使能之后操作IO口才有效!
......;
IO端口输出高低电平函数:
...........;
IO的输入
IO端口输入输出模式设置:
.....................1
Delay延时函数:
..........2
IO端口使用总结:
...............................2
IO口时钟配置:
........................................2
初始化IO口参数:
...................................2
注意:
时钟使能之后操作IO口才有效!
......................2
IO端口输出高低电平函数:
..................2
IO的输入和输出宏定义方式:
................3
读取某个IO的电平函数:
.......................3
IO口方向切换成双向............................3
IO口外部中断的一般步骤:
......................3
内部ADC使用总结:
..................................4
LCDTFT函数使用大全.................................5
TFTLCD使用注意点:
.................................5
IO端口宏定义和使用方法:
....................6
Keil使用心得:
................................6
ucGUI移植...................................6
DDSAD9850测试程序:
..........................6
ADC使用小结:
....................................7
ADC测试程序:
...................................9
DAC—tlv5638测试程序.........................9
红外测试程序:
.......................................9
DMA使用心得:
.................................9
通用定时器使用:
.........................9
BUG发现:
.................................10
编程总结:
.................................10
时钟总结:
.......................................10
汉字显示(外部SD卡字库):
...........11
字符、汉字显示(内部FLASH).......12
图片显示:
...........................................16
触摸屏:
..................................................17
引脚连接:
................19
IO端口输入输出模式设置:
Delay延时函数:
delay_ms(u16nms);
delay_us(u32nus);
IO端口使用总结:
1)使能IO口时钟。
调用函数为RCC_APB2PeriphClockCmd()。
2)初始化IO参数。
调用函数GPIO_Init();
3)操作IO。
IO口时钟配置:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);
初始化IO口参数:
注意:
时钟使能之后操作IO口才有效!
GPIO_InitTypeDefGPIO_InitStructure;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_15;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;GPIO_Init(GPIOA,&GPIO_InitStructure);//上拉输入
GPIO_InitTypeDefGPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);//LED0-->PA.8端口配置//推挽输出
技巧:
如果为同一端口的不同引脚,可以使用或运算,如GPIO_InitStructure.GPIO_Pin=
GPIO_Pin_13|GPIO_Pin_15;
IO端口输出高低电平函数:
GPIO_SetBits(GPIOA,GPIO_Pin_8|GPIO_Pin_9);//PA.8输出高GPIO_ResetBits(GPIOA,GPIO_Pin_8);
GPIO_WriteBit(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin,BitActionBitVal);//可以输出1,也可以输出0
GPIO_Write(GPIO_TypeDef*GPIOx,uint16_tPortVal);//整体输出一个值
IO的输入和输出宏定义方式:
#defineDATAOUT(x)GPIOB->ODR=x;//数据输出
#defineDATAINGPIOB->IDR;//数据输入
#defineDATAOUT(DataValue)
{GPIO_Write(GPIOB,(GPIO_ReadOutputData(GPIOB)&0xff00)|(DataValue&0x00FF));}//PB0~7,作为数据线
读取某个IO的电平函数:
(一)读出一个IO口电平
GPIO_ReadInputDataBit(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin)
#defineKEY0GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_13)//PA13
#defineKEY1GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_15)//PA15
#defineKEY2GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)
(二)读出某个IO口的全部电平
GPIO_ReadInputData(GPIOC)
IO口方向切换成双向
IIC里面的一个实例
#defineSDA_IN(){GPIOC->CRH&=0XFFFF0FFF;GPIOC->CRH|=8<<12;}//PC12
#defineSDA_OUT(){GPIOC->CRH&=0XFFFF0FFF;GPIOC->CRH|=3<<12;}
IO口外部中断的一般步骤:
1)初始化IO口为输入。
2)开启IO口复用时钟,设置IO口与中断线的映射关系。
3)初始化线上中断,设置触发条件等。
4)配置中断分组(NVIC),并使能中断。
5)编写中断服务函数。
例程:
开启IO口复用时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);
GPIOA.13中断线以及中断初始化配置GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource13);EXTI_InitTypeDefEXTI_InitStructure;EXTI_InitStructure.EXTI_Line=EXTI_Line13;EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;//[此外还可以为(EXTI_Trigger_Rising,EXTI_Trigger_Rising_Falling)]EXTI_InitStructure.EXTI_LineCmd=ENABLE;
EXTI_Init(&EXTI_InitStructure);NVIC_InitTypeDefNVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn;//使能按键所在的外部中断通道//[此外还可以为NVIC_InitStructure.NVIC_IRQChannel=EXTI0_IRQn];NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x02;//抢占优先级2,NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x01;//子优先级1NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//使能外部中断通道NVIC_Init(&NVIC_InitStructure);
中断函数的编写:
(蓝色字体为格式)
voidEXTI0_IRQHandler(void)
{
delay_ms(10);//消抖
if(EXTI_GetITStatus(EXTI_Line0)!
=RESET)//检查指定的EXTI0线路触发请求发生与否{
LED0=!
LED0;
LED1=!
LED1;
}
EXTI_ClearITPendingBit(EXTI_Line0);//清除EXTI0线路挂起位
}
voidEXTI15_10_IRQHandler(void)
{
delay_ms(10);//消抖
if(EXTI_GetITStatus(EXTI_Line13)!
=RESET){}
elseif(EXTI_GetITStatus(EXTI_Line15)!
=RESET){}
EXTI_ClearITPendingBit(EXTI_Line13);//清除EXTI13线路挂起位
EXTI_ClearITPendi