STM32F10x 学习笔记 1 (使用STM32F10x StdPeriph Driver)
么坏处。
(9)将.\CMSIS;.\StdPeriphDriver这两个目录加入到头文件的搜索目录中。
(10)将startup_stm32f10x_cl.s添加到组CMSIS中,新建个main.c文件,加入到组Source中。
(11)修改“stm32f10x.h”文件。在文件中找到这一段:
- #if!defined(STM32F10X_LD)&&!defined(STM32F10X_LD_VL)&&!defined(STM32F10X_MD)&&!defined(STM32F10X_MD_VL)&&!defined(STM32F10X_HD)&&!defined(STM32F10X_XL)&&!defined(STM32F10X_CL)
- /*#defineSTM32F10X_LD*//*!
- /*#defineSTM32F10X_LD_VL*//*!
- /*#defineSTM32F10X_MD*//*!
- /*#defineSTM32F10X_MD_VL*//*!
- /*#defineSTM32F10X_HD_VL*//*!
- /*#defineSTM32F10X_HD*//*!
- /*#defineSTM32F10X_XL*//*!
- /*#defineSTM32F10X_CL*//*!
- #endif
- /*#defineSTM32F10X_LD_VL*//*!
将对“#defineSTM32F10X_CL”的注释去掉。
找到“#defineUSE_PERIPH_LIBRARY”将注释去掉。
(12)将“system_stm32f10x.c”加入到组“CMSIS”中,找到如下代码:
- #ifdefined(STM32F10X_LD_VL)||(definedSTM32F10X_MD_VL)||(definedSTM32F10X_HD_VL)
- /*#defineSYSCLK_FREQ_HSEHSE_Value*/
- #defineSYSCLK_FREQ_24MHz24000000
- #else
- /*#defineSYSCLK_FREQ_HSEHSE_Value*/
- /*#defineSYSCLK_FREQ_24MHz24000000*/
- /*#defineSYSCLK_FREQ_36MHz36000000*/
- /*#defineSYSCLK_FREQ_48MHz48000000*/
- /*#defineSYSCLK_FREQ_56MHz56000000*/
- #defineSYSCLK_FREQ_72MHz72000000
- #endif
根据板子上的使用的时钟系统来确定SYSCLK的频率。
至此,该设置的都设置的差不多了,可以开始写应用代码了。我这里以闪灯程序为例吧。我的开发板上有四个LED,分别对应的GPIO端口D的PD2、PD3、PD4和PD7。
下面先给一个不利用STM32F10x_StdPeriph_Driver中库函数,只利用STM32F10x_StdPeriph_Driver中给出的外设寄存器的定义。下面是main.c的代码。
- #include"stm32f10x.h"
- voiddelay(void)
- {
- uint32_ti;
- for(i=0;i<3000000L;i++)
- {
- }
- }
- intmain(void)
- {
- RCC->APB2ENR|=0x00000020;
- GPIOD->CRL=0x24422244;//PD2PD3PD4PD7SettoOutputmode
- for(;;)
- {
- GPIOD->ODR=0x00000000;
- delay();
- GPIOD->ODR=0x0000009C;
- delay();
- }
- }
下面再给个利用TM32F10x_StdPeriph_Driver中库函数的代码。
- #include"stm32f10x.h"
- #defineRCC_GPIO_LEDRCC_APB2Periph_GPIOD
- #defineGPIO_LED_PORTGPIOD
- #defineGPIO_LED1GPIO_Pin_2
- #defineGPIO_LED2GPIO_Pin_3
- #defineGPIO_LED3GPIO_Pin_4
- #defineGPIO_LED4GPIO_Pin_7
- #defineGPIO_LED_ALLGPIO_LED1|GPIO_LED2|GPIO_LED3|GPIO_LED4
- voiddelay(void)
- {
- uint32_ti;
- for(i=0;i<3000000L;i++)
- {
- }
- }
- intmain(void)
- {
- GPIO_InitTypeDefGPIO_InitStructure;
- SystemInit();
- /*EnableGPIOB,GPIOCandAFIOclock*/
- RCC_APB2PeriphClockCmd(RCC_GPIO_LED|RCC_APB2Periph_AFIO,ENABLE);
- /*LEDspinsconfiguration*/
- GPIO_InitStructure.GPIO_Pin=GPIO_LED_ALL;
- GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
- GPIO_Init(GPIO_LED_PORT,&GPIO_InitStructure);
- for(;;)
- {
- GPIO_SetBits(GPIO_LED_PORT,GPIO_LED_ALL);
- delay();
- GPIO_ResetBits(GPIO_LED_PORT,GPIO_LED_ALL);
- delay();
- }
- }
编译程序,在链接阶段报错了,错误信息如下:
- BuildtargetSTM32F107
- linking...
- test.axf:Error:L6218E:UndefinedsymbolGPIO_Init(referredfrommain.o).
- test.axf:Error:L6218E:UndefinedsymbolGPIO_ResetBits(referredfrommain.o).
- test.axf:Error:L6218E:UndefinedsymbolGPIO_SetBits(referredfrommain.o).
- test.axf:Error:L6218E:UndefinedsymbolRCC_APB2PeriphClockCmd(referredfrommain.o).
- test.axf:Notenoughinformationtolistimagesymbols.
- test.axf:Finished:1information,0warningand4errormessages.
- Targetnotcreated
说的很明白,GPIO_Init、GPIO_ResetBits、GPIO_SetBits、RCC_APB2PeriphClockCmd这几个函数的实现没有找到。解决的办法显而易见,将“stm32f10x_gpio.c”和“stm32f10x_rcc.c”两个文件加入到组“StdPeriphDriver”中,再编译就通过了。将程序下载到板子上,一切正常。
上面只说了个大概的流程,还有些如何设置J-Link一类的都略去了,因为介绍这些的文章实在是太多了。
STM32F10xStdPeriphDrive 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)