在Keil4中建立基于V3.4.0固件库的STM32工程(转)


几个月前刚接触STM32时,第一感觉就是固件库里的文件又多又深,还好发现固件库里自带有范例文件,但是它们全都是针对特定的评估板的,手头只有一块STM MCU 3 in 1 MiniKit。虽说作些修改就可为我所用,可对于像我这样还没入门的菜鸟,知道要如何修改,并且编译通过,却是非常困难。
<wbr><wbr>昨晚闲暇,在网上找了一些资料,自己也学着新建了一个工程。今天写下来,顺带温故一遍。</wbr></wbr>

<wbr><wbr><wbr>首先介绍一下操作环境:</wbr></wbr></wbr>
<wbr><wbr><wbr><a href="http://www.keil.com/" target="_blank" style="text-decoration:none; color:rgb(118,95,71)">Keil</a>版本:<strong>μVision 4.1.0</strong></wbr></wbr></wbr>
<wbr><wbr><wbr><a href="http://www.stmicroelectronics.com.cn/cn/com/home/home.jsp" target="_blank" style="text-decoration:none; color:rgb(118,95,71)">STM32</a>固件库版本:<strong>V3.4.0</strong></wbr></wbr></wbr>

<wbr><wbr></wbr></wbr> 第一步,建立工程文件夹,在其子文件夹内拷贝并整理好相应的文件。
<wbr><wbr><wbr>1.1、建立工程文件夹,将它命名为"SysTick"。</wbr></wbr></wbr>
<wbr><wbr><wbr>1.2、在"SysTick"下分别建立"Lib"、"User"、"List"及"Object"这四个文件夹。</wbr></wbr></wbr>
<wbr><wbr><wbr>1.3、将固件库中"Libraries"文件夹下的"CMSIS"和"STM32F10x_StdPeriph_Driver"这两个文件夹拷贝至上一步建立的"Lib"文件夹下。</wbr></wbr></wbr>
<wbr><wbr><wbr>1.4、将固件库中"Project"--&gt;"STM32F10x_StdPeriph_Examples"--&gt;"SysTick"内的全部文件拷贝至第2步建立的"User"文件夹下。</wbr></wbr></wbr>
<wbr><wbr><wbr>至此,第一步已经完成。</wbr></wbr></wbr>

<wbr><wbr><span style="color:#ED1C24; word-wrap:normal; word-break:normal; line-height:21px">第二步,建立Keil工程。</span></wbr></wbr>
<wbr><wbr><wbr>2.1、"Project"--&gt;"New<wbr>μVision Project...",将新建立的工程保存在步骤1.1时建立的"SysTick"文件夹下,并命名为"SysTick"。</wbr></wbr></wbr></wbr>
<wbr><wbr><wbr>2.2、在弹出的"Select Device for 'Target1'..."对话框中,选择相应的器件,ST MCU 3 in 1 MiniKit上的芯片是STM32F103C8,所以我选择STM32F103C8。确定完成后按"OK"。</wbr></wbr></wbr>
<wbr><wbr><wbr>2.3、在弹出的询问是否添加启动代码的对话框中,选"否"。因为我们使用固件库中的启动代码。</wbr></wbr></wbr>
<wbr><wbr><wbr>2.4、点击按钮,在Target1下建立四个Groups: "CMSIS"、"User"、"Lib"、"StartUp"。</wbr></wbr></wbr>
<wbr><wbr><wbr><wbr>在"CMSIS"Grout下添加如下两个c文件:"\SysTick\Lib\CMSIS\CM3\CoreSupport\core_cm3.c"以及"\SysTick\User\system_stm32f10x.c"。</wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr>在"User"Group下添加如下两个c文件:"\SysTick\User\main.c"和"\SysTick\User\stm32f10x_it.c"。</wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr>在"Lib"Group下添加如下四个c文件:"\SysTick\Lib\STM32F10x_StdPeriph_Driver\src\misc.c"、</wbr></wbr></wbr></wbr>
"\SysTick\Lib\STM32F10x_StdPeriph_Driver\src\stm32f10x_flash.c"、"\SysTick\Lib\STM32F10x_StdPeriph_Driver\src\stm32f10x_gpio.c"
和"\SysTick\Lib\STM32F10x_StdPeriph_Driver\src\stm32f10x_rcc.c"。
<wbr><wbr><wbr><wbr>在 "StartUp"Group下添加"\SysTick\Lib\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm\startup_stm32f10x_md.s"。</wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr>根据你所使用的不同容量的芯片,选择对应的启动代码文件。</wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr>添加完所有的文件后,点击"OK"。</wbr></wbr></wbr></wbr>
<wbr><wbr><wbr>2.5、点击"Target Options..."按钮,作如下设置。</wbr></wbr></wbr>
<wbr><wbr><wbr><wbr>"Output"标签下",Select Folder for Objects..."选择步骤1.2时建立的"Object"文件夹作为保存路径。</wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr>"Listing"标签下,"Select Folder for Listings..."选择步骤1.2时建立的"List"文件夹作为保存路径。</wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr>"C/C++"标签下,"Define"后填写"USE_STDPERIPH_DRIVER, STM32F10X_MD";"Include Paths"内添加".\Lib\CMSIS\CM3\CoreSupport"、".\Lib\CMSIS\CM3\DeviceSupport\ST\STM32F10x"、".\Lib\STM32F10x_StdPeriph_Driver\inc"、".\User"。添加完成后点击"OK"。</wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr>完成所有设置后,点击"OK"。</wbr></wbr></wbr></wbr>
<wbr><wbr>到此为止,工程已建立完成。</wbr></wbr>

<wbr><wbr>关键点提示:</wbr></wbr>
<wbr><wbr>1、步骤2.5中"C/C++"中定义的两个宏,"USE_STDPERIPH_DRIVER"表示使用固件库,"STM32F10X_MD"与你所使用的芯片相对应,步骤2.4中启动代码文件的选择也与此类似。</wbr></wbr>
<wbr><wbr>2、"stm32f10x_conf.h"这个文件,里面可以选择你所使用的外设,方法是——将使用的外设前的注释去掉即可。</wbr></wbr>
<wbr><wbr>3、步骤2.4,其目的是添加头文件的路径,虽然看起来很烦琐,但理解其目的后就会显得清楚多了。</wbr></wbr>

<wbr><wbr><wbr></wbr></wbr></wbr>
<wbr><wbr><span style="color:#ED1C24; word-wrap:normal; word-break:normal; line-height:21px">这个地方讲得更清楚跟透彻:</span><a href="http://blog.ednchina.com/xukai871105/1981649/message.aspx" style="text-decoration:none; color:rgb(118,95,71)">http://blog.ednchina.com/xukai871105/1981649/message.aspx</a></wbr></wbr>
<wbr><wbr><span style="color:#ED1C24; word-wrap:normal; word-break:normal; line-height:21px">这里的视频也不错:</span><a href="http://v.youku.com/v_show/id_XMjQyMDg1MDMy.html" style="text-decoration:none; color:rgb(118,95,71)">http://v.youku.com/v_show/id_XMjQyMDg1MDMy.html</a></wbr></wbr>

补充:

MDK中出现 Error: Flash download failed-"Cortex-M3"的原因及解决办法

出现这处问题通常是MDK中的Flash的编程算法没有配置或没有配置正确,

在主菜单中打开Flash->Configure Falsh Tools配置窗口,切换到“Utilities"页。


按“Setting"按钮进入“Flash download setup"配置窗口

然后一路按“OK”按钮退出配置窗口


在“Flash download setup"配置窗口点击“Add”按钮进入“Add Flash Programming Algorlthm"窗口

在“Add Flash Programming Algorlthm"窗口,根据你实际使用的芯片选择,这里的豆皮STM32开发板用的是STM32F103VBT6,应先择"STM32F10X 128kB Flash",选定编程算法后,按“Add”按钮。


之后一路按"OK"按扭确认修改的配置.






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用Keil固件STM32F103微控制器来实现矩阵按键控制LED的亮灭。以下是一个基本的示例代码: ```c #include "stm32f10x.h" #define ROW_NUM 4 #define COL_NUM 4 // 定义矩阵按键的行和列引脚 #define ROW_PORT GPIOA #define COL_PORT GPIOB void LED_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); // 使能GPIOC时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; // PC13 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 最大输出速度50MHz GPIO_Init(GPIOC, &GPIO_InitStructure); // 初始化GPIOC13 } void Keypad_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE); // 使能GPIOA和GPIOB时钟 // 配置行引脚为推挽输出 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); // 配置列引脚为上拉输入 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); } uint8_t Keypad_Scan(void) { uint8_t row, col; uint8_t key = 0xFF; // 遍历每一行 for (row = 0; row < ROW_NUM; row++) { // 设置当前行为低电平,其他行为高电平 GPIO_Write(GPIOA, ~(0x01 << row)); // 检测每一列的状态 for (col = 0; col < COL_NUM; col++) { if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_4 + col) == RESET) { // 检测到按键按下 key = (row * COL_NUM) + col; break; } } if (key != 0xFF) break; } // 恢复所有行引脚为高电平 GPIO_Write(GPIOA, 0xFF); return key; } int main(void) { uint8_t key; LED_Init(); Keypad_Init(); while (1) { key = Keypad_Scan(); if (key != 0xFF) { // 根据按键值控制LED亮灭 if (key == 0) // 第一行第一列 GPIO_SetBits(GPIOC, GPIO_Pin_13); // 点亮LED else GPIO_ResetBits(GPIOC, GPIO_Pin_13); // 熄灭LED } } } ``` 这段代码使用了4行4列的矩阵按键,将按键行引脚连接到GPIOA的0至3引脚,将按键列引脚连接到GPIOB的4至7引脚。LED连接到GPIOC的13引脚。在`main`函数,通过调用`Keypad_Scan`函数来检测按键状态,根据按键值控制LED亮灭。 请注意,以上代码仅供参考,你可能需要根据你的具体硬件连接和需求进行适当的修改。同时,你也需要在Keil配置正确的编译和调试环境。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值