完整版STM32F103通用教程文档格式.docx
《完整版STM32F103通用教程文档格式.docx》由会员分享,可在线阅读,更多相关《完整版STM32F103通用教程文档格式.docx(11页珍藏版)》请在冰豆网上搜索。
.....................1
..........2
...............................2
........................................2
...................................2
......................2
..................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
汉字显示(外部SD卡字库):
...........11
字符、汉字显示(内部FLASH).......12
图片显示:
...........................................16
触摸屏:
..................................................17
引脚连接:
................19
delay_ms(u16nms);
delay_us(u32nus);
1)使能IO口时钟。
调用函数为RCC_APB2PeriphClockCmd()。
2)初始化IO参数。
调用函数GPIO_Init();
3)操作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);
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_InitStructure.GPIO_Pin=GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&
//LED0-->
PA.8端口配置//推挽输出
技巧:
如果为同一端口的不同引脚,可以使用或运算,如GPIO_InitStructure.GPIO_Pin=
GPIO_Pin_13|GPIO_Pin_15;
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);
//整体输出一个值
#defineDATAOUT(x)GPIOB->
ODR=x;
//数据输出
#defineDATAINGPIOB->
IDR;
//数据输入
#defineDATAOUT(DataValue)
{GPIO_Write(GPIOB,(GPIO_ReadOutputData(GPIOB)&
0xff00)|(DataValue&
0x00FF));
}//PB0~7,作为数据线
(一)读出一个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|=3<
}
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)
if(EXTI_GetITStatus(EXTI_Line13)!
=RESET){}
elseif(EXTI_GetITStatus(EXTI_Line15)!
EXTI_ClearITPendingBit(EXTI_Line13);
//清除EXTI13线路挂起位
EXTI_ClearITPendi