STM32寄存器和标准库点流水灯

阅读: 评论:0

STM32寄存器和标准库点流水灯

STM32寄存器和标准库点流水灯

目录

一.使用寄存器方式点亮流水灯

1.实验器材

2.实验思路

3.1程序代码

3.2运行效果

4.1加入P13管脚

(1)程序代码

(2)运行效果

(3)实验图思考

(4)改进代码

(5)改进后运行效果

二.使用标准库方式点亮流水灯

1.复制相关库文件到文件夹中

(1)如同添加文件夹core,lib,obj

(2)下载库函数文件

2.添加文件到工程

(1)core中

(2)lib中

(3)obj中

3.配置工程

(1)添加文件到工程

(2)选择OutPut路径,选择自己的obj文件,生成hex文件

(3)配置全局宏量

4.程序代码

5.运行效果


一.使用寄存器方式点亮流水灯

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,BRCC_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

本文发布于:2024-02-01 01:59:18,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170672396233032.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:寄存器   流水   标准
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23