目录
(2)选择OutPut路径,选择自己的obj文件,生成hex文件
一.使用寄存器方式点亮流水灯
1.实验器材
单片机:stm32f103C8T6
TTL转接口
三个红黄绿LED发光二极管
若干杜邦线
KeilMDK软件
单片机下载软件mcuisp
使用引脚:A1,B1,B10
2.实验思路
设置三个灯分别为A1,B1,B10
使用while循环给寄存器附不同的高低电平使三个灯达到下列状态
(1)A1亮,B1,B10熄灭
(2)B1亮,A1,A10熄灭
(3)B10亮,A1,B1熄灭
3.1程序代码
//APB2外设时钟使能寄存器
#define RCC_APB2ENR *((unsigned volatile int*)0x40021018)
//选择CPIOA1,GPIOB1,GPIOB10作为点灯输出引脚
#define GPIOA_CRL *((unsigned volatile int*)0x40010800) //GPIOA配置寄存器
#define GPIOB_CRL *((unsigned volatile int*)0x40010C00) //GPIOB配置低寄存器
#define GPIOB_CRH *((unsigned volatile int*)0x40010C04) //GPIOB配置高寄存器
#define GPIOA_ODR *((unsigned volatile int*)0x4001080C) //GPIOA输出数据寄存器
#define GPIOB_ODR *((unsigned volatile int*)0x40010C0C) //GPIOB输出数据寄存器
//延时函数
void Delay_ms( volatile unsigned int t){
unsigned int i,j;
for(j = 0; j < t; j++){
for(i = 0; i < 1000 ; i++);
}
}
int main() {
//使能a,b时钟
RCC_APB2ENR|=1<<2;
RCC_APB2ENR|=1<<3;
//GPIOA1设置为推挽输出
GPIOA_CRL&=0xFFFFFF0F; //设置位 清零
GPIOA_CRL|=0x00000030; //PA1推挽最快速输出
//GPIOB1设置为推挽输出
GPIOB_CRL&=0xFFFFFF0F;
GPIOB_CRL|=0x00000030;
//GPIOB10设置为推挽输出
GPIOB_CRH&=0xFFFFF0FF;
GPIOB_CRH|=0x00000300;
while(1){
//位操作置B1,B10低电平,A1高电平
GPIOB_ODR&=~(1<<1);
GPIOB_ODR&=~(1<<10);
GPIOA_ODR|=1<<1;
Delay_ms(10000);
//位操作置A1,B10低电平,B1高电平
GPIOA_ODR=~(1<<1);
GPIOB_ODR=~(1<<10);
GPIOB_ODR|=1<<1;
Delay_ms(10000);
//位操作置A1,B1低电平,B10高电平
GPIOA_ODR&=~(1<<1);
GPIOB_ODR&=~(1<<1);
GPIOB_ODR|=1<<10;
Delay_ms(10000);
}
}
3.2运行效果
LED1
4.1加入P13管脚
(1)程序代码
//APB2外设时钟使能寄存器
#define RCC_APB2ENR *((unsigned volatile int*)0x40021018)
//选择CPIOA1,GPIOB1,GPIOB10作为点灯输出引脚
#define GPIOA_CRL *((unsigned volatile int*)0x40010800) //GPIOA配置寄存器
#define GPIOB_CRL *((unsigned volatile int*)0x40010C00) //GPIOB配置低寄存器
#define GPIOB_CRH *((unsigned volatile int*)0x40010C04) //GPIOB配置高寄存器
#define GPIOC_CRH *((unsigned volatile int*)0x40011004) //GPIOC配置高寄存器
#define GPIOA_ODR *((unsigned volatile int*)0x4001080C) //GPIOA输出数据寄存器
#define GPIOB_ODR *((unsigned volatile int*)0x40010C0C) //GPIOB输出数据寄存器
#define GPIOC_ODR *((unsigned volatile int*)0x4001100C) //GPIOC输出数据寄存器
//延时函数
void Delay_ms( volatile unsigned int t){
unsigned int i,j;
for(j = 0; j < t; j++){
for(i = 0; i < 1000 ; i++);
}
}
int main() {
//使能a,b时钟
RCC_APB2ENR|=1<<2;
RCC_APB2ENR|=1<<3;
RCC_APB2ENR|=1<<4;
//GPIOA1设置为推挽输出
GPIOA_CRL&=0xFFFFFF0F; //设置位 清零
GPIOA_CRL|=0x00000030; //PA1推挽最快速输出
//GPIOB1设置为推挽输出
GPIOB_CRL&=0xFFFFFF0F;
GPIOB_CRL|=0x00000030;
//GPIOB10设置为推挽输出
GPIOB_CRH&=0xFFFFF0FF;
GPIOB_CRH|=0x00000300;
//GPIOC13设置为推挽输出
GPIOC_CRH&=0xFF0FFFFF;
GPIOC_CRH|=0x00300000;
while(1){
//位操作置B1,B10, C13低电平,A1高电平
GPIOB_ODR&=~(1<<1);
GPIOB_ODR&=~(1<<10);
GPIOC_ODR&=~(1<<13);
GPIOA_ODR|=1<<1;
Delay_ms(10000);
//位操作置A1,B10, C13低电平,B1高电平
GPIOA_ODR=~(1<<1);
GPIOB_ODR=~(1<<10);
GPIOC_ODR&=~(1<<13);
GPIOB_ODR|=1<<1;
Delay_ms(10000);
//位操作置A1,B1, C13低电平,B10高电平
GPIOA_ODR&=~(1<<1);
GPIOB_ODR&=~(1<<1);
GPIOC_ODR&=~(1<<13);
GPIOB_ODR|=1<<10;
Delay_ms(10000);
//位操作置A1,B1, B10低电平,C13高电平
GPIOA_ODR&=~(1<<1);
GPIOB_ODR&=~(1<<1);
GPIOB_ODR&=~(1<<10);
GPIOC_ODR|=1<<13;
//GPIOC_ODR&=~(1<<13);
Delay_ms(10000);
}
}
(2)运行效果
LED2
(3)实验图思考
此时,将1置为高电平,将0置为低电平,根据上面实验图我们可看到此时发光二极管是不导通的,我们将P13的置位状态相反(0为高电平,1为低电平)
(4)改进代码
//APB2外设时钟使能寄存器
#define RCC_APB2ENR *((unsigned volatile int*)0x40021018)
//选择CPIOA1,GPIOB1,GPIOB10作为点灯输出引脚
#define GPIOA_CRL *((unsigned volatile int*)0x40010800) //GPIOA配置寄存器
#define GPIOB_CRL *((unsigned volatile int*)0x40010C00) //GPIOB配置低寄存器
#define GPIOB_CRH *((unsigned volatile int*)0x40010C04) //GPIOB配置高寄存器
#define GPIOC_CRH *((unsigned volatile int*)0x40011004) //GPIOC配置高寄存器
#define GPIOA_ODR *((unsigned volatile int*)0x4001080C) //GPIOA输出数据寄存器
#define GPIOB_ODR *((unsigned volatile int*)0x40010C0C) //GPIOB输出数据寄存器
#define GPIOC_ODR *((unsigned volatile int*)0x4001100C) //GPIOC输出数据寄存器
//延时函数
void Delay_ms( volatile unsigned int t){
unsigned int i,j;
for(j = 0; j < t; j++){
for(i = 0; i < 1000 ; i++);
}
}
int main() {
//使能a,b时钟
RCC_APB2ENR|=1<<2;
RCC_APB2ENR|=1<<3;
RCC_APB2ENR|=1<<4;
//GPIOA1设置为推挽输出
GPIOA_CRL&=0xFFFFFF0F; //设置位 清零
GPIOA_CRL|=0x00000030; //PA1推挽最快速输出
//GPIOB1设置为推挽输出
GPIOB_CRL&=0xFFFFFF0F;
GPIOB_CRL|=0x00000030;
//GPIOB10设置为推挽输出
GPIOB_CRH&=0xFFFFF0FF;
GPIOB_CRH|=0x00000300;
//GPIOC13设置为推挽输出
GPIOC_CRH&=0xFF0FFFFF;
GPIOC_CRH|=0x00300000;
while(1){
//位操作置B1,B10, C13低电平,A1高电平
GPIOB_ODR&=~(1<<1);
GPIOB_ODR&=~(1<<10);
GPIOC_ODR|=1<<13;
GPIOA_ODR|=1<<1;
Delay_ms(10000);
//位操作置A1,B10, C13低电平,B1高电平
GPIOA_ODR=~(1<<1);
GPIOB_ODR=~(1<<10);
GPIOC_ODR|=1<<13;
GPIOB_ODR|=1<<1;
Delay_ms(10000);
//位操作置A1,B1, C13低电平,B10高电平
GPIOA_ODR&=~(1<<1);
GPIOB_ODR&=~(1<<1);
GPIOC_ODR|=1<<13;
GPIOB_ODR|=1<<10;
Delay_ms(10000);
//位操作置A1,B1, B10低电平,C13高电平
GPIOA_ODR&=~(1<<1);
GPIOB_ODR&=~(1<<1);
GPIOB_ODR&=~(1<<10);
//GPIOC_ODR|=1<<13;
GPIOC_ODR&=~(1<<13);
Delay_ms(10000);
}
}
(5)改进后运行效果
LED
二.使用标准库方式点亮流水灯
1.复制相关库文件到文件夹中
(1)如同添加文件夹core,lib,obj
(2)下载库函数文件
下载地址:STSW-STM32054 - STM32F10x标准外设库 - 意法半导体STMicroelectronics
2.添加文件到工程
(1)core中
(2)lib中
(3)obj中
3.配置工程
(1)添加文件到工程
(2)选择OutPut路径,选择自己的obj文件,生成hex文件
(3)配置全局宏量
STM32F10X_MD,USE_STDPERIPH_DRIVER
赋值到对应位置
4.程序代码
#include "stm32f10x.h"
void delay_ms(uint16_t time)
{
uint16_t i = 0;
while(time--)
{
i = 10000;
while(i--);
}
}
int main(void)
{
//时钟使能A,B
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
//配置
GPIO_InitTypeDef led_initA1;
led_initA1.GPIO_Pin = GPIO_Pin_1;
led_initA1.GPIO_Mode = GPIO_Mode_Out_PP;
led_initA1.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitTypeDef led_initB1;
led_initB1.GPIO_Pin = GPIO_Pin_1;
led_initB1.GPIO_Mode = GPIO_Mode_Out_PP;
led_initB1.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitTypeDef led_initB10;
led_initB10.GPIO_Pin = GPIO_Pin_10;
led_initB10.GPIO_Mode = GPIO_Mode_Out_PP;
led_initB10.GPIO_Speed = GPIO_Speed_10MHz;
//初始化
GPIO_Init(GPIOA, &led_initA1);
GPIO_Init(GPIOB, &led_initB1);
GPIO_Init(GPIOB, &led_initB10);
while(1)
{
GPIO_ResetBits(GPIOB, GPIO_Pin_1);
GPIO_ResetBits(GPIOB, GPIO_Pin_10);
GPIO_SetBits(GPIOA, GPIO_Pin_1);
delay_ms(1000);
GPIO_ResetBits(GPIOA, GPIO_Pin_1);
GPIO_ResetBits(GPIOB, GPIO_Pin_10);
GPIO_SetBits(GPIOB, GPIO_Pin_1);
delay_ms(1000);
GPIO_ResetBits(GPIOA, GPIO_Pin_1);
GPIO_ResetBits(GPIOB, GPIO_Pin_1);
GPIO_SetBits(GPIOB, GPIO_Pin_10);
delay_ms(1000);
}
}
5.运行效果
LED