stm32开发板使用手册_第1页
stm32开发板使用手册_第2页
stm32开发板使用手册_第3页
stm32开发板使用手册_第4页
stm32开发板使用手册_第5页
已阅读5页,还剩170页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

01

注意事 开发环境搭 开发环境简 软件及驱动安 KEILMDK安 SecureCRT安装及连 FlyMcu安 Sourceinsight安 JLINK安 KEILMDK使 获取帮 新建一个项 JLINK设 新建一个 23

硬件简 开发板代码 开发板硬件资 开发板原理 开发板 软件简 软 Workspace和 源代码结 应用层代码结 中间件代码结 驱动层代码结 第4章STM32库详 STM32库获 STM32 结构及文 STM32_USB-FS- STM32库如何STM32寄存 STM32启动过 第5章 GPIO简 GPIO应用实例跑马 实例描 实验效 硬件设 软件设 第6章SysTick(系统滴答 SysTick简 SysTick应用实例实现精确延 实例描 实验效 硬件设 软件设 789

串 串口简 串口应用实例向串口输出o 实例描 实验效 硬件设 软件设 半主机机制 半主机机制简 半主机机制应用实例printf,scanf重映射到串 实例描 实验效 硬件设 软件设 外部中断 异常和中断简 异常号及其向量 异常优先 外部中 外部中断应用实例捕捉GPIO下降 实例描 实验效 硬件设 软件设 1011

独立看门 独立看门狗简 独立看门狗应用实例按键重载看门狗计数 实例描 实验效 硬件设 软件设 通用定时器 通用定时器简 通用定时器应用实例TIM2输出实例描 实验效 硬件设 软件设 第12章 DMA简 DMA应用实例通过DMA向UART传输数 实例描 实验效 硬件设 软件设 第13章 ADC简 ADC主要特 ADC模块的方框 ADC应用实例ADC采样输入电 实例描 实验效 硬件设 软件设 14

内部温度传感器应用实例检测内部温 实例描 实验效 硬件设 软件设 第15章片内flash模拟 Flash和 Flash和EEPROM对 内部Flash模拟EEPROM原 Flash掉电数据恢 内部flash应用实例模拟 实例描 实验效 硬件设 软件设 16

器件电子签 器件电子签名应用实例内部信 实例描 实验效 硬件设 软件设 第17章μC/OS- μC/OS-III简 μC/OS-III移 源代码获 软 结 uCOS-III移植过 移 uC- 移 uC- 移 移 移 μC/OS-III应用实例创建LED跑马灯任 实例描 实验效 硬件设 软件设 第18 RTOS简 RTOS移 RTOS代码获 软 结 RTOS移植过 RTOS应用实例创建LED跑马灯任 实例描 实验效 硬件设 软件设 19

如何测 软件设 第0注意事项章,STM32常亮,表示有供电,LED0灯会闪烁,表示代码在运行,具体测试请先读完该手册前4章和开发版测试章节。 ltk\内,文件名为:原理图 ltk\common\ltk_stm32_code_hex内,nvwa_tform_check.hex为开发板出厂测试软件。所有的实例都已经建好了KEILproject,直接打开就可以编译运行,如你想学习ledproject,该project在dk内,文件名为001_led.uvproj,双击打开即可。我还建立了KEILworkspace,打开该workspace,可以打开所有的project,在目第1章开发环境搭建开发环境简介KEILMDKSourceinsightJLINKV8建议使用FlyMcu通过串口软件SecureCRT软件及驱动安装KEILMDK 下的mdkxxx.exe(xxx代表版本注意:win7用户请右击,选择“以管理员运行”ltk\common\tools\arm_mdk\keil_mdk_crack.pdfMDK5STM32F1xxProjectManagePackPacksKeil::STM32F1xx_DFPInstall按钮安装STM32F1xx包。如果没有看到此包,左上角的CheckforUpdates按钮,等待从网络更新。串口驱动及软件安装STM开发板CH340GUSB转串口,一般情况下即插即用,无须安装驱动,如果插上开发板的标有UART的USB口,无法使用,找到ltk\common\tools下的CH341SER.EXE,双击安装,重启电脑。USBUARTUSB口,找出COM口编号,在windows设备管理器你将会看到这个COM,不一定都是COM9,也有可能是其他端口,如COM2,COM3…。SecureCRT安装及连找到ltk\common\toolsSecureCRT.rar,解压缩到你的目标文件数设置如下,然后连接,COMCOM2windows设OptionsSessionOptions,OptionsSessionOptions,FlyMcu 下的FlyMcu.rar到目标 无需安装,双击解压缩后的FlyMcu.exe即可。Sourceinsight 装完成后输入序列号,序列号在ltk\common\tools\sourceinsight\sn.txt内。JLINK如需要你了JLINK,请找到ltk\JlinkSetup_JLinkARM_Vxxxx.zip,双击解压缩出来的Setup_JLinkARM_Vxxxx.exe,按提示完成安装。安装完成后,用户手册在:C:\ProgramFiles\SEGGER\JLinkARM_Vxxxx\Doc\Manuals注:xxxxKEILMDK获取帮KEILMDKHelpμVisionHelp.会出现该软件的具体使ltk\common\ltk_stm32_code_hex内,项目在该 keil\stm32\projects\nvwaledkeil\stm32\projects\nvwa\001_led\mdk\001_led.uvproj如果你想打开所有的项目,你可以打开workspace keil\stm32\projects\nvwa\workspace,打开nvwa.uvmpw,右击激活对应的项新建一个项目我们以新建led项目为例子。首先 拷贝到E盘 用于保存我们新建的led项目。KeiluVisionProjectNewμVisionProjectOK此时弹出ManageRun-TimeEnvironment框,我们选择Cancel,不选择任何SoftwareComponent.Target1KEIL(project),如下,此项目内不包含任何文件,右击该项目名,选择ManageComponents… 下角的AddFiles添加文件。Device页用于选择类型,开发板使用STM32F103C8T6,Target页不需要做任何改变Output页的设置如下,点击SelectFolderforObjects…按钮,选择输出Objects的 ofExecutable设置为ledListing页不需要做任何改变User页不需要做任何改变C/C++页非常重要,Define:用于定义宏,我们用的是开发板,定义宏LTK_NVWA,IncludePaths用于告诉编译器头文件的查找路径,点击右侧的按钮可以弹出FolderSetup.在FolderSetup,点击空白行右边的按钮, Asm页不需要做任何改变Linker页不需要做任何改变Debug页和你使用的调试器有关,如果未使用任何调试器,该页无需做任何改变,如果你使用JLINKV8调试代码,请参考JLINK设置章Utilites页和你使用的调试器有关,如果未使用任何调试器,该页无需做任何改变,如果你使用JLINKV8调试代码,请参考JLINK设置章JLINKDebug页,选择Use:J-LINK/J-TraceSettingsCortexJ-LINK/J-TraceTargetDriver框,在Debug页,选择SWPortCortexJ-LINK/J-TraceTargetDriverSetup框,Trace页不需要CortexJ-LINK/J-TraceTargetDriverSetup框,FlashDownload标签页点击Add,在弹出的框内选择STM32F10xMed-densityFlash,点击Add加入。一直确认,返回到OptionsforTarget‘led’框,Utilities页,选UseTargetDriverforFlashProgramming:J-LINK/J-Trace 来开始/停止调试。在调试过程中,你还可以点击run,step…等按钮来调试。或者选择Download按钮代码。代码后需要手动重启开发板新建一个ProjectNewMulti-Projectworkspace的,输入你要保存的workspace名。以我选择的E:\keil\stm32\projects\nvwa\workspace,workspacenvwa点击保存,然后在你弹出的框内选择你要加入的Project的project第2硬件简介开发板代码使用FlyMcu代码,FlyMcu安装请参考FlyMcu安装章USBUARTUSB口,SecureCRT,请先关闭该软件或者重启电脑)然后选择你要的文件,选择STMISP,RESETBOOT0松开RESET键,看到程序正在的进度条松开BOOT0键,等待完成开发板开机硬件检USBUSB口,打开串口调试工具(SecureCRT),此时POWERLED,LED0不停的闪动串口输出:inputyourstringmax80提示你输入,若你在串口输入字符,然后按下回车符,此时串口会刚才输入的字符打印出来。KEY0,串口会输出:keypressed若你在开发板上了其它代码,需要恢复出厂代码时按照开发板代码章节,选择 开发板硬件资源板上有USB转串口,无需任何其他配件就可以代码,配套的实例,无需任何其他配件,不需要飞线,便可以开发; 和ADC采样实验。板载USB转串口板载电源LDOAMS117-3.3V,将USB输入的5V电源转换为需要的3.3V;BOOT0MCU的代码,开发板代码章节有具体描述;USBUSB(UART)为串口,用于输入,输出打印信息,所有的实例都用这个USBUSB(旁边标有USB)连接到STM32的USB,两个USB都可以供电,同时只三个插座,其中两个用于引MCU的引脚,MCU所有的脚都引出来了。另外一个为JTAG插座,用于连接JLINK进行硬件仿真。USBUSB片 Flash:64KbytesRAM:20K 接GPIO引脚,主开发板原理图JTAG

开发板该开发板尺寸为5x5cm,主所有引脚引出,间距2.54m,并在旁边#ifdef#ifdef#include第3软件简介软 结构及移 结构清晰易懂,设计严格遵守driver/middleware/application分层结构,所有的寄存器操作都会在driver层实现(ST3.5驱动),middleware实现具体的模块功能,application层实现实例的功能,这种严格的结构化代码使得代码非常容易,移植,易懂,并且所有的层的源代码全部开放。基于这种结构,STM32开发板和STM32开发板上使用同一个的driver,middleware。而application层也基本相同。不同的开发板仅需要在项目文件内定义不同的宏,如何定义宏,请参考KEILMDK使用章节。如开发板定义宏LTK_NVWA(有些project还定义了其它宏)。ltk_board.h内,根据定义的宏包含不同的开发板的头文件,如盘古开发板包含ltk_board_pangu.h。drivermiddleware移植到其他板子,仅需要在项目文件内增加自己的开发板的宏,然后再编写自己的开发板头文件,include到ltk_board.h内。软件 Workspace块,如文件ltk_usart.c,所有关现,ltk_gpio.c则实现所有的 SetasActiveProject可以选择该04_semihostingproject,打开目keil\stm32\projects\nvwa\驱动层(driver)STWorkspace里边包含很多个project,按照由易到难,编001_led开始。右SetasActiveProject可project代码模块化,易移植,风引应用层代码结构支包含头文应用支包含头文应用层函main应用层文件功中间件代码结构ltk_gpio.c为例:驱动层代码结构ST3.5第4STM32库详STM32我们使用STM32V3.5库,去,如果没有网络,我已经好了,放在ltk\common\3rd_party_source_code\stsw-stm32054.zip,STM32 结构及文我们仅仅使用了STM32的驱动,在解压缩 Libraries内stm32f10x_stdperiph_lib_um.为ST库的使用说明文档。CMSISCortexMicrocontrollerSoftwareInterfaceStandard的简写,它外设的接口。CMSIS使得不同公司生产的ARM-Cortex内核的的软件可以该由ARM公司和不同的,软件供应商共同定义,为ARMCortex内核提供了统一的处理器和外设接口。STM32库使用的CMSIS版本为V1.30。CMSISSTM32CMSIS的 CoreSpuppror下,包含有core_cm3.h和core_cm3.c两个文件。该两个文件实现了用户处理器内核和器件外设硬件虚拟层(HAL),标准化了Cortex-M处理器的SysTick,NVIC,SystemControlBlcok寄存器,MPU寄存器,FPU寄存器的定义和内Intrinsicfunctions,CCPUCMSIS-Device, 异常向量表,并实现了异常向量Reset_Handler,该异常向量最后会跳转到main函数。该文件为项目的唯一汇编程序文件,其他文件都是C内初始化了STM32系统,配置了时钟。 STM32_USB-FS-STM32库如何STM32寄存我们通过一个具体的例子来阐述STM32库是如何STM32寄存器的模式,此处略过,具体请参考GPIO章节),通过参考参考文件GPIOA_BSRRBS110对该寄存器无影响,所以对整32位寄存器操作GPIOA_BSRR=0x02即可。由上图看出GPIOA_BSRR寄存器的偏移地址为0x10。参考参考手册STM32_Reference_manual_V14.pdf以及规格书其址为0x 。如下两张图。所以GPIOA_BSRR寄存器的地址为 +0x10。只需要将地址为0x +0x10的GPIOA_BSRR32位寄存器设置为0x02即可,PA1就输出高电平。参考源代码,我们调用GPIO_SetBits(GPIOA,GPIO_Pin_1);就可以设置的输出为高(在文件stm32f10x_gpio.c内)

和#definePERIPH_BASE )/*!<Peripheralbaseaddressinthealiasregion*/#define#define (PERIPH_BASE+((uint16_t)0x0002)((uint16_t)0x0002)/*!<Pin1selected#define((GPIO_TypeDef*)#define(APB2PERIPH_BASE+#define

GPIOA_BASE=(APB2PERIPH_BASE+=((PERIPH_BASE+0x10000)+= )+0x10000)+=通过上面的运算,我们看到GPIOA的值为0x GPIO_TypeDef指针,也就是说,GPIOA的值是某个数据的地址,该数据类型为GPIO_TypeDef。GPIO_TypeDef定义如下,CRL的地址偏移为0x0,CRH的值为0x +0x10。也就是GPIOA->BSRR的值为0x 0x10,往地址0x +0x10内写入0x02,PA1就会输出高电平,对应的操作为GPIOA->BSRR=0x02。 cancanbe*@retval*GPIO_Pin:specifiestheportbitstobe*451*@briefSetstheselecteddataport*@paramGPIOx:wherexcanbe(A..G)toselecttheGPIOGPIOA->BSRR=

8voidGPIO_SetBits(GPIO_TypeDef*GPIOx,uint16_t9{/*ChecktheparametersGPIOx->BSRR=}STM32启动过12341234STACK,NOINIT,READWRITE, 1Heap_Size HEAP,NOINIT,READWRITE, 它异常向量都在在文件stm32f10x_it.c内实现。 ;Topof 3;NMI4;Hard ;MPUFault ;BusFault ;UsageFault80;90;0;0;;;Monitor0;;;;External ; ;EXTI ; ; ; ; ;EXTILine ;EXTILine ;EXTILine ;EXTILine ;EXTILine ;DMA11 ;DMA12 ;DMA13 ;DMA14 ;DMA15 ;DMA16 ;DMA17 ; USB_HP_CAN1_TX_IRQHandler;USBHighPriorityorCAN1TX USB_LP_CAN1_RX0_IRQHandler;LowPriorityorCAN1;;;;;;and;;;;;;;;;;;;;;EXTIEXTI;;RTCUSBfromSystemInit来初始化STM32,初始化完成后,调用C库函数12345R0,67R0,=8

,函数SetSysClock()再调用SetSysClockTo72()来配置STM32的工作时钟树。配置如下图红色线条标注,开发板外接的晶振为8M,PLLXMUL配置为X9,此时得到系统时钟SYSCLK为72MHzHCLK72MHz,APB272MHz,APB1时钟为36MHz,USB时钟为48MHz 112345678*SetsSystemclockfrequencyto72MHzandconfigure*andPCLK1Thisfunctionshouldbeusedonlyafterreset.*@retvalstaticvoid9 IOuint32_tStartUpCounter=0,HSEStatus=/*SYSCLK,HCLK,PCLK2andPCLK1/*EnableHSERCC->CR|=/*WaittillHSEisreadyandifTimeoutisreachedexit*/{HSEStatus=RCC->CR&}while((HSEStatus==0)&&(StartUpCounterif((RCC->CR&RCC_CR_HSERDY)!={HSEStatus=}{HSEStatus=}if(HSEStatus=={/*EnablePrefetchBuffer*/FLASH->ACR|=FLASH_ACR_PRFTBE;/*Flash2waitstateFLASH->ACR|=(uint32_t)FLASH_ACR_LATENCY_2;/*HCLK=SYSCLKRCC->CFGR|=/*PCLK2=HCLKRCC->CFGR|=/*PCLK1=HCLKRCC->CFGR|=#ifdef/*Configure/*PLL2configuration:PLL2CLK=(HSE/5)*8=40MHz/*PREDIV1configuration:PREDIV1CLK=PLL2/5=8MHzRCC->CFGR2&=(uint32_t)~(RCC_CFGR2_PREDIV2|RCC_CFGR2_PLL2MUL|RCC->CFGR2|=(uint32_t)(RCC_CFGR2_PREDIV2_DIV5|RCC_CFGR2_PLL2MUL8|/*EnablePLL2RCC->CR|=/*WaittillPLL2isreadywhile((RCC->CR&RCC_CR_PLL2RDY)=={}/*PLLconfiguration:PLLCLK=PREDIV1*9=72MHzRCC->CFGR&=(uint32_t)~(RCC_CFGR_PLLXTPRE||RCC->CFGR|=(uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1|RCC_CFGR_PLLSRC_PREDIV1|/*PLLconfiguration:PLLCLK=HSE*9=72MHzRCC->CFGR&=(uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC|RCC_CFGR_PLLXTPRE|#endif/*STM32F10X_CL

/*EnablePLLRCC->CR|=/*WaittillPLLisready*/while((RCC->CR&RCC_CR_PLLRDY)==0){}/*SelectPLLassystemclocksourceRCC->CFGR&=(uint32_t)((uint32_t)~(RCC_CFGR_SW));RCC->CFGR|=(uint32_t)RCC_CFGR_SW_PLL;/*WaittillPLLisusedassystemclocksourcewhile((RCC->CFGR&(uint32_t)RCC_CFGR_SWS)!={}

{/*IfHSEfailstostart-up,theapplicationwillhaveconfiguration.Usercanaddheresomecodetodealthiserror 101第5GPIOSTM32的一个最基本的外设,可以通过软件配置为以下8种模式:STM32GPIOSTM32端口输出模式复位期间和刚复位后,复用功能未开启,I/O端口被配置成浮空输入模式PA14:JTCK置于PA13:JTMS置于上拉模PB4JNTRST(GPIOx_IDR)APB2I/OGPIO应用实 跑马实例描实验效USBLED0硬件设PA1连接到LED0I/O50MHzGPIOLEDVCC软件设在该实例的应用层文件led_main.c中,首先调用中间件11*参数*返回567{8uint32_t9/*LEDwhile{/*LED/*for(i=0;i ;/*LED/*for(i=0;i;}}LED模块使用到的GPIO在文 1*1*描述初始化*参数*返回void{/*LED/*LEDGPIO1214 *描述点亮/voidltk_led_set(ltk_led_tled,{uint16_tled_pin=GPIO_TypeDef*led_port=/*LED0pinif(led=={led_pin=led_port=}/*LED1pinelseif(led=={led_pin=led_port=}/*LEDif(led!={(value=={/*LEDGPIOGPIOLED}elseif(value=={/*熄灭LED*/} 5254*参数led*返回{83uint16_tled_pin=GPIO_TypeDef*led_port=/*LED0pinif(led=={led_pin=LED0_GPIO_PIN;led_port=LED0_GPIO_PORT;}/*LED1pinelseif(led=={led_pin=LED1_GPIO_PIN;led_port=LED1_GPIO_PORT;}/*LEDif(led!={/*切换LED点亮状态*/led_port->ODR^led_pin;}11*描述LED*参数*返回1*描述1*描述LEDGPIOGPIO*参数*返回

56void7{89/*LED0GPIO50MHzgpio_init_struct.GPIO_Pin=gpio_init_struct.GPIO_Mode=/*LED1GPIO50MHzgpio_init_struct.GPIO_Pin=}STM32GPIO平,调用驱动层文件stm32f10x_gpio.c内的GPIO_ResetBits函数1*@briefClearstheselecteddataport*@paramGPIOx:wherexcanbe(A..G)toselecttheGPIO4*@paramGPIO_Pin:specifiestheportbitstobe5 can6*@retval78voidGPIO_ResetBits(GPIO_TypeDef*GPIOx,uint16_t9{/*ChecktheparametersGPIOx->BRR=}1*@briefSetsthe1*@briefSetstheselecteddataport*@paramGPIOx:wherexcanbe(A..G)toselecttheGPIO*@paramGPIO_Pin:specifiestheportbitstobe ThisparametercanbeanycombinationofGPIO_Pin_xwherexcanbe(0..15).*@retvalvoidGPIO_SetBits(GPIO_TypeDef*GPIOx,uint16_t{/*ChecktheparametersGPIOx->BSRR=}第6章SysTick(系统滴答SysTick简介SysTickCortex-M324位递减计数器,设定初始值后,一SysTick0时,会重SysTick0时,会由于SysTick为CM3内核自带,使得软件在不同CM3生产商移植配置SysTick非常简单,只需要调用库文件 SysTick应用实 实现精确延实例描SysTickGPIO章节的空指令延迟,使LED0每一秒(非常精确)开关一次。实验效USBLED0硬件设VCC软件设1*参数*返回1*参数*返回int{/*10001while{ 181/*LED0->PA1#define#define#define

SysTick初始化在中间件文件 内实现,SysTick初始化函数为voidltk_systick_init(uint32_tsystick_hz),SysTick中断设置为每隔1/需要得到更小的延迟单位,请修改传递给SysTick初始化函数ltk_systick_init(uint32_tsystick_hz)的参数systick_hz。

每增加1,系统便已经运行了1voidvoidltk_systick_delay(uint32_t

ltk_systick_delay1#if(!definedLTK_RTOS&&!definedLTK_UCOS)3staticuint32_tvolatilesystick_timer=0;5*描述*参数:time:延迟的长*返回{uint32_tsystick_timer_snapshot={}}*参数*返回systick_timeruint32_t{return}*参数*返回void{}*描述:设置系统滴答计数器中断的频*返回{if(SysTick_Config(SystemCoreClock/{/*while}}12*12*@briefInitializeandstarttheSysTickcounterand3456789* numberofticksbetweentwo1=failed,0=*Initialisethesystemticktimeranditsinterruptandstartsystemticktimer/counterperiodicalrunningmodeto11 INLINEuint32_tSysTick_Config(uint32_t1212 if(ticks>SysTick_LOAD_RELOAD_Msk)returnReloadvalueimpossible*/SysTick->LOAD=(ticks&SysTick_LOAD_RELOAD_Msk)-1; setreloadregister*/NVIC_SetPriority(SysTick_IRQn,(1<<NVIC_PRIO_BITS)-1);/*setPriorityforCortex-M0SystemInterrupts*/SysTick- = LoadtheSysTickCounterValueSysTick-=SysTick_CTRL_CLKSOURCE_Msk|/*EnableSysTickIRQandSysTickTimer return Functionsuccessful221*@brief1*@briefThisfunctionhandlesSysTick*@param*@retvalvoid{9第7串口简配置。当发送器被激活,并且不发送数据时,TX引脚处于高电平。STM32的串口为全双工的异步通信,采用分数波特率发生系统,发送和接串口应用实例向串口输 o实例描8,一位停止位,无奇偶校验位,无硬件流量控制,TXRX都使能。设实验效oworld!烧录该软件后,将USB线一头接到电脑,另一头接到开发板上标有UART的USB口,在电脑的串口终端工具(如SecureCRT)就能看到每隔一秒,打印oworld!硬件设板子上集成了USB转串口CH340G,仅需要将USB的一端插到电脑,另外一端插入板子上标有UARTUSB口即可,如果提示没有安装驱动,请安装CH340G驱动,开发环境搭建一章有详细描述。VCC_51234567SS1234567SS

0软件设我们先

开始,该函数在应用层文

内实现,先初始化输出oworld!串口发送接收都非常简单,只要调用ST驱动函数USART_SendData和USART_ReceiveData即可。注意,在发送之前,记得检查传输完成标志 1 **描述:*参数:ch:*返回{/*while(USART_GetFlagStatus(USART1,USART_FLAG_TC)=={}1315*描述:从串口串口接收一个字*参数uint16_t{/*while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)=={}return2730*参数*返回void{/*串口配置如下 -波特 =81奇偶校验位:-硬件流控 无(RTS和CTS信号线发送和接收: usart_init_struct.USART_BaudRate=115200;usart_init_struct.USART_WordLength=USART_WordLength_8b;usart_init_struct.USART_StopBits=USART_StopBits_1;usart_init_struct.USART_Parity==5659usart_init_struct.USART_Mode=USART_Mode_Rx|/*USART*参数*返回void{69串口的时钟(RCC)在文 11*描述:*参数*返回void{1*1*描述配置串口(UART)*参数

**返回678913|TX|PA9|RX|PA10void{27/*TX50MHz*/gpio_init_struct.GPIO_Mode=GPIO_Mode_AF_PP;gpio_init_struct.GPIO_Pin=GPIO_Pin_9;gpio_init_struct.GPIO_Speed=GPIO_Speed_50MHz;/*RX50MHzgpio_init_struct.GPIO_Mode=GPIO_Mode_IN_FLOATING;gpio_init_struct.GPIO_Pin=GPIO_Pin_10;171719 *@briefReturnsthemostrecentreceiveddatabytheUSARTx*@paramUSARTx:SelecttheUSARTortheUART**ThisparametercanbeoneofthefollowingUSART1,USART2,USART3,UART4or*@retvalThereceived{33/*Checktheparameters/*ReceiveDatareturn(uint16_t)(USARTx->DR&11 *@briefInitializestheUSARTxperipheralaccordingto34567**parametersintheUSART_InitStructUSARTx:SelecttheUSARTortheUART**ThisparametercanbeoneofthefollowingUSART1,USART2,USART3,UART4or*USART_InitStruct:pointertoa thatcontainstheconfigurationinformationforspecified9**@retvalvoidUSART_Init(USART_TypeDef*USARTx,USART_InitTypeDef*{uint32_ttmpreg=0x00,apbclock=uint32_tintegerdivider=uint32_tfractionaldivider=uint32_tusartxbase=/*Checktheparametersassert_param(IS_USART_PARITY(USART_InitStruct-;assert_param(IS_USART_MODE(USART_InitStruct-andUSART3*/if(USART_InitStruct->USART_HardwareFlowControl!={ usartxbase=(uint32_t)USARTx;35/*USARTCR2tmpreg=USARTx-/*ClearSTOP[13:12]bits*/tmpreg&=CR2_STOP_CLEAR_Mask;/*SetSTOP[13:12]bitsaccordingtoUSART_StopBitsvalue*/tmpreg|=(uint32_t)USART_InitStruct->USART_StopBits;/*WritetoUSARTCR2*/USARTx->CR2=(uint16_t)tmpreg;/*USARTCR1tmpreg=USARTx-/*ClearM,PCE,PS,TEandREbitstmpreg&=/*ConfiguretheUSARTWordLength,Parityand/*SettheMbitsaccordingtoUSART_WordLengthvalue/*SetPCEandPSbitsaccordingtoUSART_Parityvalue/*SetTEandREbitsaccordingtoUSART_Modevaluetmpreg|=(uint32_t)USART_InitStruct->USART_WordLength|USART_InitStruct->USART_Parity|USART_InitStruct-/*WritetoUSARTCR1USARTx->CR1=(uint16_t)tmpreg;59/*USARTCR3tmpreg=USARTx-/*ClearCTSEandRTSEbitstmpreg&=/*ConfiguretheUSARTvalue*/tmpreg|=USART_InitStruct-/*WritetoUSARTCR3USARTx->CR3=(uint16_t)tmpreg;69/*USARTBRR/*ConfiguretheUSARTBaud if(usartxbase=={apbclock= {apbclock= /*Determinetheintegerpartif((USARTx->CR1&CR1_OVER8_Set)!={/*IntegerpartcomputingincaseOversamplingmodeis8integerdivider=((25*apbclock)/(2* else/*if((USARTx->CR1&CR1_OVER8_Set)==0){/*IntegerpartcomputingincaseOversamplingmodeis16integerdivider=((25*apbclock)/(4(USART_InitStruct- tmpreg=(integerdivider/100)<</*Determinethefractionalpartfractionaldivider=integerdivider-(100*(tmpreg>>4));/*Implementthefractionalpartintheregisterif((USARTx->CR1&CR1_OVER8_Set)!={tmpreg|=((((fractionaldivider*8)+50)/100)) else/*if((USARTx->CR1&CR1_OVER8_Set)==0){tmpreg|=((((fractionaldivider*16)+50)/100))&109

/*WritetoUSARTBRR*/USARTx->BRR=(uint16_t)tmpreg;第8主机机制半主机机制简介使用ARM目标系统上的输入输出设备。这点非常重要,因为开发初期,可能开发者根本不知道该ARM目标系统ARM目标系统的外设,再将输入输出重定向到ARM目标系统上。fputcfgetc函数,将其重映射(retargeting)到串printfscanf实例描Cprintf,scanf重映射到开发板的串口,在主循环内调用printfscanf来捕获用户的输入,并把用户的实验效烧录该软件后,将USB线一头接到电脑,另一头接到开发板上标有UART的USB口,在电脑的串口终端工具(SecureCRTinputyourstring,max:80提示你输入字符串(80),此时你可以在串口输入数据,刚才你输入的数据会回显,按下回车结束当前输入,此时串口会输出yourinputstringis加上你刚才输入的字符串。硬件设板子上集成了USB转串口CH340G,仅需要将USB的一端插到电脑,另外一端插入板子上标有UARTUSB口即可,如果提示没有安装驱动,请安装CH340G驱动,开发环境搭建一章有详细描述。VCC_51234567SS1234567SS

0软件设 来提示用户在串口这两个函数分别调用C语言库函 C语言库函 和scanf被重定向到串口,所以调用这两个函数会向/*semhosting#pragmaimport(口打印数据,和捕获串口输入数据。这部分功能在文件/*semhosting#pragmaimport(然后重写函数fputc和fgetc将C语言库函数printf(retargeting)到串

1123456**f:intfputc(intch,FILE{91315/*returnfgetc(FILE{int/*ch=/*return}函 调用文件ltk_usart.c的函数ltk_usart_send_char11*描述:*参数:ch:*返回串口发送接收在ST驱动文件stm32f10x_usart.c内实现,详细代码如下:11*@briefTransmitssingledatathroughtheUSARTx*@paramUSARTx:SelecttheUSARTortheUART*USARTx:SelecttheUSARTortheUART**ThisparametercanbeoneofthefollowingUSART1,USART2,USART3,UART4or*@retvalThereceived{33/*Checktheparameters/*ReceiveDatareturn(uint16_t)(USARTx->DR&4*Thisparametercanbeoneofthefollowing5*USART1,USART2,USART3,UART4or6*@paramData:thedatato7*@retval89voidUSART_SendData(USART_TypeDef*USARTx,uint16_t{/*Checktheparameters/*TransmitDataUSARTx->DR=(Data&}*@briefReturnsthemostrecentreceiveddatabythe第9部中断异常和中断简介STM32ARMCORTEXM3Reset-NMI-HardFault-常将会有HardFault异常来处理;会有HardFault异常来处理;将会有HardFault异常来处理;DebugMonitor,使能,优先级都可以配置SVCall496个外部中断,STM32mediumdensity器件支持的外部中断可看文件startup_stm32f10x_md.s,68个外部中异常号及其向量表 1234567-Externalinterrupt……Externalinterrupt 0SP_mainmainstackReset,NMIHardFault-3,-2-1,其它异常的优先级可以软件配置,软件可配置的优先级从0开始。8256,优先级值最小值总是为08位,如果没有实现全80,不会用到。STM32使用了中断位的高四位,所以总共有16个可编程的优先等级。CortexM3优先级是有分组的(prioritygrou),优先级分组将异常优先级分为两组,分别为组优先级(grouppriority)和次优先级(subpriority)。组双边沿都触发)。每个输入线都可以独立地被。挂起寄存器保持着状态线的EXTIEXTI16连接到PVDEXTI17RTCEXTI18USBGPIO实例描GPIOPA2,使能其时钟,并配置为悬浮输入,然后使能外部2,PA2外部有上拉电阻和对地按键,在按键没有按下时,输入检测为高电平,2EXTI2_IRQHandler内会切换LED点亮,熄灭状态。实验效烧录该软件后USB线一头接到电脑,另一头接到开发板上标有UARTUSB口,按下按键0(KEY0),LED0的点亮,熄灭状态会切换。原先熄灭硬件设VCC软件设1 *描述:主函数,配置按键为外部中断,当检测到按下(下降沿),改变LED的开1 *描述:主函数,配置按键为外部中断,当检测到按下(下降沿),改变LED的开状**参数*返回int{while 14

ltk_key.c,实现了按键初始化,按键外部中断映射,断映射,将PA2映射到外部中断2(EXTI2),配置为下降沿触发,按键状态函数if(key=={key_pin=key_port=}elseif(key=={key_pin=key_port=}{return}} 12*描述初始化按键时钟3*参数无4*返回无56void7{8 9 }

11*描述配置按键(key)GPIOGPIO,请查阅*参数4*返回56void7{89/*(key0GPIO50MHzgpio_init_struct.GPIO_Pin=/*(key1GPIO50MHzgpio_init_struct.GPIO_Pin=}12*描述3*参数4*返回56void7{89/*4bitforpre-emptionpriority,0bitsforsubpriority/*KEY0nvic_init_struct.NVIC_IRQChannelPreemptionPriority=/*KEY1}

112*描述3*参数4*返回56void7{89/*KEY0EXTI/*EXTI/*KEY1EXTI /*EXTI}1*@briefThisfunctionisthehandlerofexti1*@briefThisfunctionisthehandlerofexti*@paramexti_line,extilineof*@retvalvoidexti_handler(uint32_t{#ifdef{/*ToggleLED0/*CleartheKeyButtonEXTIlinependingbit #ifdef{}#ifdefpen_state_t{pen_st=pen_st->_adjust=}}12*@briefThisfunctionhandlesExternalinterruptLine23*@param4*@retval56void7{89}NVIC驱动在文 2bitsfor @argNVIC_PriorityGroup_3:3bitsforpre-emption 1bitsfor @argNVIC_PriorityGroup_4:4bitsforpre-emption 0bitsfor*@retval{/*Checktheparameters/*SetthePRIGROUP[10:8]bitsaccordingtoNVIC_PriorityGroupvalue*/SCB->AIRCR=AIRCR_VECTKEY_MASK|2426*@briefInitializestheNVICperipheralaccordingtothe parametersinthe*@paramNVIC_InitStruct:pointertoaNVIC_InitTypeDefstructurethatcontains theconfigurationinformationforthespecifiedNVIC*@retval{uint32_ttmppriority=0x00,tmppre=0x00,tmpsub=0x0F;/*Checktheparametersif(NVIC_InitStruct->NVIC_IRQChannelCmd!={/*ComputetheCorrespondingIRQtmppriority=(0x700-((SCB->AIRCR)&(uint32_t)0x700))>>tmppre=(0x4-tmpsub=tmpsub>>tmppriority; tmppriority tmppriority|=NVIC_InitStruct->NVIC_IRQChannelSubPriority&tmpsub; tmppriority=tmppriority<<0x04; NVIC->IP[NVIC_InitStruct->NVIC_IRQChannel]=tmppriority; /*EnabletheSelectedIRQ(uint32_t)0x01<<(NVIC_InitStruct->NVIC_IRQChannel& {/*DisabletheSelectedIRQ(uint32_t)0x01<<(NVIC_InitStruct->NVIC_IRQChannel& 65EXTI1*@briefInitializestheEXTIperipheralaccordingtothe parametersinthe*@paramEXTI_InitStruct:pointertoaEXTI_InitTypeDef thatcontainstheconfigurationinformationfortheEXTIperipheral.*@retval{uint32_ttmp=/*Checktheparametersassert_param(IS_EXTI_MODE(EXTI_InitStruct-assert_param(IS_EXTI_TRIGGER(EXTI_InitStruct-assert_param(IS_EXTI_LINE(EXTI_InitStruct-tmp=if(EXTI_InitStruct->EXTI_LineCmd!={/*ClearEXTIlineconfigurationtmp+=EXTI_InitStruct-*(IOuint32_t*)tmp|=EXTI_InitStruct-/*ClearRisingFallingedgeconfiguration{/*RisingFallingedgeEXTI->RTSR|=EXTI_InitStruct->EXTI_Line;EXTI->FTSR|=EXTI_InitStruct-}{tmp=tmp+=EXTI_InitStruct-*(IOuint32_t*)tmp|=EXTI_InitStruct-}}{tmp+=EXTI_InitStruct-56/*Disabletheselectedexternallines*(IOuint32_t*)tmp&=~EXTI_InitStruct-}第10章独立看门狗独立看门狗简介STM32在意外状况下(比如软件陷入死循环,STM32看门狗设计上就是一个计数器,计数器能装载的最大数值和计数器数器就减1,直到计数器计数为0就产生一个复位信号,重启系统。“喂狗”),STM32不会重启,而由于软件或硬件的原因,导致在计数器递减到0之前无法喂狗,STM32将会重启。独立看门狗(IWDG)由的低速时钟(LSI)驱动,即使主时钟发生故障它也独立看门狗应用实 按键重载看门狗计数实例描 触发,当按下按键KEY0,产生一个下降沿,触发中断处理函EXTI2_IRQHandler按下按键KEY0,系统则一直正常运行。实验效烧录该软件后USB线一头接到电脑,另一头接到开发板上标有UART的USB口,此时会点亮LED0,如果每次都在两秒内按下按键KEY0,LED0保持如果在两秒钟之内没有按下按键KEY0LED则会熄灭一会儿再点亮,表硬件设本实例用到了LED0和KEY0,LED0用来指示系统是否重启,KEY0VCCVCC软件设

1*参数*返回int{89/*10001/*IWDG1*参数*返回int{89/*10001/*IWDG2ltk_led_set(LTK_LED0,0);while{}}独立看门狗初始化在中间件层文件 内实现其超时计算为timeout=(Reload/(40KHz(LSI)/IWDG_Prescaler))1*描述IWDGIWDG*参数iwdg_prescalerIWDG *返回voidltk_iwdg_init(uint8_tiwdg_prescaler,uint16_t{9uint16_t/*IWDGuint16_tiwdg_prescaler_table[]={4,8,16,32,64,128,/*IWDG超时计算:(reload/(40KHz(LSI)//*由于LSI的不精确,不同的超时有一定的误差reload=(time_out_ms*40/*IWDG_PRIWDG_RLR/*IWDG计数器时钟40KHz(LSIiwdg_prescaler/*/*IWDG27件stm32f10x_iwdg.c。/*/*KRregisterbitmask#define #define 1*@briefEnablesordisableswriteaccesstoIWDG_PRandIWDG_RLR*@paramIWDG_WriteAccess:newstateofwriteaccesstoIWDG_PRandIWDG_RLRregisters. Thisparametercanbeoneofthefollowing @argIWDG_WriteAccess_Enable:EnablewriteaccesstoIWDG_PRandIWDG_RLRregisters @argIWDG_WriteAccess_Disable:DisablewriteaccesstoIWDG_PRandIWDG_RLRregisters*@retval{/*ChecktheparametersIWDG->KR=1416*@briefSetsIWDGPrescaler*@paramIWDG_Prescaler:specifiestheIWDGPrescaler Thisparametercanbeoneofthefollowing @argIWDG_Prescaler_4:IWDGprescalersetto @argIWDG_Prescaler_8:IWDGprescalersetto @argIWDG_Prescaler_16:IWDGprescalersetto @argIWDG_Prescaler_32:IWDGprescalersetto @argIWDG_Prescaler_64:IWDGprescalersetto @argIWDG_Prescaler_128:IWDGprescalersetto @argIWDG_Prescaler_256:IWDGprescalersetto*@retval{/*ChecktheparametersIWDG->PR=3436*@briefSetsIWDGReload*@paramReload:specifiestheIWDGReload Thisparametermustbeanumberbetween0and*@retvalvoidIWDG_SetReload(uint16_t{/*ChecktheparametersIWDG->RLR=4749*@briefReloadsIWDGcounterwithvaluedefinedinthereload (writeaccesstoIWDG_PRandIWDG_RLRregisters*@param*@retvalvoid{IWDG->KR=5860*@briefEnablesIWDG(writeaccesstoIWDG_PRandIWDG_RLRregistersdisabled).*@param*@retvalvoid{IWDG->KR=6870*@briefCheckswhetherthespecifiedIWDGflagissetor*@paramIWDG_FLAG:specifiestheflagto Thisparametercanbeoneofthefollowing @argIWDG_FLAG_PVU:PrescalerValueUpdateon @argIWDG_FLAG_RVU:ReloadValueUpdateon*@retvalThenewstateofIWDG_FLAG(SETor{FlagStatusbitstatus=/*Checktheparametersif((IWDG->SR&IWDG_FLAG)!={bitstatus=}{bitstatus=}/*Returntheflagstatusreturn}第11用定时器通用定时器简介通用定时器由16位自动装载计数器构成,该计数器通过可编程预分频器驱动。它适用于多种场合,包括测量输入信号的脉冲长度(输入捕获)或者产生输 )。使用定时器预分频器和RCC时钟控制器预分频器, 实例描PA1TIM2_CH2,使其输出波形用来驱动连接LED的阴极,所以占空比越大,LED0越暗。实验效烧录该软件后,将USB线一头接到电脑,另一头接到开发板上标有UART的USB口,此时连接到TIM2_CH2上的LED0会很暗,该实例频率配置为1KHz,占空比为90%。硬件设制LED的亮度。VCC软件设我们先从main开始,该函数在应用层文件tim_ 初始化并使能了TIM。1/*LED0->TIM2_CH21/*LED0->TIM2_CH2->PA1#define #define #define #define #define #define TIM模块功能在文 内实现,在该实例中通用计 先设置预分频,得到TIM2计数器的时钟,该实例中为1MHz,Prescaler=(TIMCLK/TIMcounterclock)-1TIMcounterclock=1MHzTIM2的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论