目录
本次实验,我们来做一个流水灯实验。听说这是个很有趣的东西。
实验准备
准备阶段,我们要准备STM32最小系统核心板(STM32F103C8T6)+面板板+3只红绿蓝LED灯,然后要准备一些驱动,这里我直接偷懒,用好朋友的U盘转来的,这样下载就不用那么久了。这里是需要mcuisp和startup。
使用寄存器方式
搭建程序
首先进入上期提到的keil软件,选择头上的project,新建一个μVersion project,这里我给他取名叫LED,然后如下图选择即可。再下一个界面就不能像上期一样勾选了,我们要先选中CMSIS里面的core,勾选后方5.4.0,接着选中device里面的startup,检查后方1.0.0的不勾选。然后就可以ok了。
看到这里的这个键,点开,设置output,选择create hex file,
选择左侧source group,右击创建led.c
在项目中写下如下代码,这里选择的三个点是PA4,PB9,PC15。
#define GPIOB_BASE 0x40010C00
#define GPIOC_BASE 0x40011000
#define GPIOA_BASE 0x40010800
#define RCC_APB2ENR (*(unsigned int *)0x40021018)
#define GPIOB_CRH (*(unsigned int *)0x40010C04)
#define GPIOC_CRH (*(unsigned int *)0x40011004)
#define GPIOA_CRL (*(unsigned int *)0x40010800)
#define GPIOB_ODR (*(unsigned int *)0x40010C0C)
#define GPIOC_ODR (*(unsigned int *)0x4001100C)
#define GPIOA_ODR (*(unsigned int *)0x4001080C)
void SystemInit(void);
void Delay_ms(volatile unsigned int);
void A_LED_LIGHT(void);
void B_LED_LIGHT(void);
void C_LED_LIGHT(void);
void Delay_ms( volatile unsigned int t)
{
unsigned int i;
while(t--)
for (i=0;i<800;i++);
}
void A_LED_LIGHT(){
GPIOA_ODR=0x0<<4; //PA4低电平
GPIOB_ODR=0x1<<9; //PB9高电平
GPIOC_ODR=0x1<<15; //PC15高电平
}
void B_LED_LIGHT(){
GPIOA_ODR=0x1<<4; //PA4高电平
GPIOB_ODR=0x0<<9; //PB9低电平
GPIOC_ODR=0x1<<15; //PC15高电平
}
void C_LED_LIGHT(){
GPIOA_ODR=0x1<<4; //PA4高电平
GPIOB_ODR=0x1<<9; //PB9高电平
GPIOC_ODR=0x0<<15; //PC15低电平
}
int main(){
int j=100;
// 开启时钟
RCC_APB2ENR |= (1<<3); // 开启 GPIOB 时钟
RCC_APB2ENR |= (1<<4); // 开启 GPIOC 时钟
RCC_APB2ENR |= (1<<2); // 开启 GPIOA 时钟
// 设置 GPIO 为推挽输出
GPIOB_CRH&= 0xffffff0f; //设置位 清零
GPIOB_CRH|=0x00000020; //PB9推挽输出
GPIOC_CRH &= 0x0fffffff; //设置位 清零
GPIOC_CRH|=0x30000000; //PC15推挽输出
GPIOA_CRL &= 0xfff0ffff; //设置位 清零
GPIOA_CRL|=0x00010000; //PA4推挽输出
// 3个LED初始化为不亮(即高点位)
GPIOB_ODR |= (1<<9);
GPIOC_ODR |= (1<<15);
GPIOA_ODR |= (1<<4);
while(j){
B_LED_LIGHT();
Delay_ms(1000000);
C_LED_LIGHT();
Delay_ms(1000000);
A_LED_LIGHT();
Delay_ms(1000000);
}
}
void SystemInit(){
}
这里注意,我们需要一个驱动,这个驱动要和我们的led.c在同一个目录下。(如果放在了其他地方可以把他复制过去)接着选择左侧source group1右击文件夹,选择Add Existing Files to Group Source Group 1,文件类型改为All FIles,选择刚刚添加的启动文件,add之后close。
现在就可以回来编译了。
搭建电路
拿出我们准备的那些工具开始连接电路板。
首先把灯装上去。以面对自己的那边为准插入三个灯灯,注意长头在最外侧,短头在第三排。然后接一根白线,如图所示。
接下来把芯片黄头朝左,右边3.3的位置和白线的位置平行,针在以蓝色线为基准第三排整体插入,然后把黄色部分上方的那个摘下来放右边。这里注意:一要小心,二要把下面针部分完全插进去,不然容易出问题。
因为我们这里是红色B9,绿色C15,黄色A4,所以使用电线将这些一一连接起来,这里注意在中间同一边的,只要是同一竖排一般都是等价的,可以不用太刻意位置。
接下来准备我们的接口,我这里使用的是USB的头,把自带的电线接成这样进行准备。
接着从上往下数,1.4接在芯片右侧的1.4头,2.3分别用电线接在芯片的A9.A10的位置,电路板就接好了。
亮灯
这里直接打开mcuisp,选择dtr低电平rts高电平,程序文件选择之前编译成功的hex文件,先读器件信息,成功之后开始编程。待到下方绿色进度条加载满了之后,把电路板从电脑上取下来,把之前黄色的那个东西还原,再把电路接回电脑,他就成功了(理论上)。
STM32CubeMX生成代码
下载
首先前往stm官网下载一个stm32cubemx,下载解压完成之后开始安装,安装途中有需要选项的部分这里指引一下,没有出现指引的地方就直接next就可以了。
STM32CubeMX - STM32Cube initialization code generator - STMicroelectronics
安装完成之后打开。在help帮助里面manage那个,下载HAL库。
调试
下载完成之后,回到主界面,新建项目。选择stm32f103c8,进入以下界面。
点击system core,进入SYS,在debug下选择serial wire。
选择上方clock configuration,找到pllclk勾选
然后回到pinout那里,找到rcc,把第一排的hse改为如图。
找到gpio,把我们要用的三个口(PA4,PB9,PC15)设置为output
点击project manager,配置好自己的路径和项目名,然后IDE那项改为MDK-ARM。
选择左侧code generator,勾选第二栏第一项,后面点击generate code,选择open project。
亮灯
接下来就是keil界面,打开左侧第二个文件夹,打开main.c,找到里面的main部分,改为如下内容,然后编译。
int main(void)
{
SystemClock_Config();//???????
MX_GPIO_Init();//gpio???
while (1)
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);//PA4??
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);//PB9??
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_SET);//PC15??
HAL_Delay(1000);//??1s
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);//PA4??
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);//PB9??
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_SET);//PC15??
HAL_Delay(1000);//??1s
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);//PA4??
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);//PB9??
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_RESET);//PC15??
HAL_Delay(1000);//??1s
}
MX_GPIO_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
这里再次把那个黄色的玩意置右,连接电脑。
再次打开mcuisp,更改hex文件路径,然后如寄存器方式运行。
成了!