STM32F103_使用心得IO端口输入输出模式设置:...........;Delay延时函数:..............;IO端口使用总结:...............;IO口时钟配置:................;初始化IO口参数:...............;注意:时钟使能之后操作IO口才有效!......;IO端口输出高低电平函数:...........;IO的输入IO端口输入输出模式设置:.....................1Delay延时函数:..........2IO端口使用总结:...............................2IO口时钟配置:........................................2初始化IO口参数:...................................2注意:时钟使能之后操作IO口才有效!......................2IO端口输出高低电平函数:..................2IO的输入和输出宏定义方式:................3读取某个IO的电平函数:.......................3IO口方向切换成双向............................3IO口外部中断的一般步骤:......................3内部ADC使用总结:..................................4LCDTFT函数使用大全.................................5TFTLCD使用注意点:.................................5IO端口宏定义和使用方法:....................6Keil使用心得:................................6ucGUI移植...................................6DDSAD9850测试程序:..........................6ADC使用小结:....................................7ADC测试程序:...................................9DAC—tlv5638测试程序.........................9红外测试程序:.......................................9DMA使用心得:.................................9通用定时器使用:.........................9BUG发现:.................................10编程总结:.................................10时钟总结:.......................................10汉字显示(外部SD卡字库):...........11字符、汉字显示(内部FLASH).......12图片显示:...........................................16触摸屏:..................................................17引脚连接:................19IO端口输入输出模式设置: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,也可以输出0GPIO_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|=812;}//PC12#defineSDA_OUT(){GPIOC-CRH&=0XFFFF0FFF;GPIOC-CRH|=312;}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_ClearITPendingBit(EXTI_Line15);//清除EXTI15线路挂起位}内部ADC使用总结:1)STM32F103系列最少都拥有2个ADC,我们选择的STM32F103RBT6也包含有2个ADC。2)STM32的ADC最大的转换速率为1Mhz,也就是转换时间为1us(在ADCCLK=14M,采样周期为1.5个ADC时钟下得到),不要让ADC的时钟超过14M,否则将导致结果准确度下降。3)STM32将ADC的转换分为2个通道组:规则通道组和注入通道组。规则通道相当于你运行的程序,而注入通道呢,就相当于中断。在你程序正常执行的时候,中断是可以打断你的执行的。同这个类似,注入通道的转换可以打断规则通道的转换,在注入通道被转换完成之后,规则通道才得以继续转换。4)STM32ADC的规则通道组最多包含16个转换,而注入通道组最多包含4个通道。5)STM32的ADC在单次转换模式下,只执行一次转换,该模式可以通过ADC_CR2寄存器的ADON位(只适用于规则通道)启动,也可