怎么让stm32单片机的某个脚输出高低电平?

怎么让stm32单片机的某个脚输出高低电平?,第1张

GPIO_SetBits(GPIOC,GPIO_Pin_3)。

GPIO_ResetBits(GPIOC,GPIO_Pin_3)。

这些函数在GPIOC文件里有。

STM32代表ARM Cortex-M内核的32位微控制器,具有高性能,实时性强,低功耗,便于低电压 *** 作等优点,同时还易于开发。

按内核架构分,有STM32F103“增强型”系、STM32F101“基本型”系列、STM32F105、STM32F107“互联型”系列。其中增强型系列时钟频率达到72MHz,是同类产品中性能最高的产品;基本型时钟频率为36MHz,以16位产品的价格得到比16位产品大幅提升的性能,是32位产品用户的最佳选择。

两个系列都内置32K到128K的闪存,不同的是 SRAM的最大容量和外设接口的组合。时钟频率72MHz时,从闪存执行代码,STM32功耗36mA,是32位市场上功耗最低的产品,相当于05mA/MHz。

在STM32F105和STM32F107互连型系列微控制器之前,意法半导体已经推出STM32基本型系列、增强型系列、USB基本型系列、互补型系列;新系列产品沿用增强型系列的72MHz处理频率。

内存包括64KB到256KB闪存和 20KB到64KB嵌入式SRAM。新系列采用LQFP64、LQFP100和LFBGA100三种封装,不同的封装保持引脚排列一致性,结合STM32平台的设计理念,开发人员通过选择产品可重新优化功能、以最小的硬件变化来满足个性化的应用需求。

所有的中断函数都在启动汇编文件中声明了都是一些弱定义,说的白一点就是中断向量表,编译后把你定义的中断函数地址填进去。要用哪个中断直接重定义那个中断函数即可。stm32f10x_itc只是官方自己为了整齐重新写的一个C,中断函数可以在任何项目C文件中去定义。

systick的中断是系统开辟了的 对于他的配置建议看下core_m3h里面的SysTick_Config(uint32_t ticks)这个函数 调用这个函数以后 初始化状态就是 使用AHB ticks的值为VAL,也就是计数的滴答值,这个值减到了0就会中断,同时VAL值重新装填 还有 调用了函数以后,默认是开启了滴答计时器,所以要在调用函数之后关闭计时器,在要用的时候开启。对于滴答的开启与关闭是用寄存器做的

void config_gpio(u32 PORTx, u32 MODE, u32 PINxs, PULL_STAT stat)//PORTx=0,则代表GPIOA,类推。PINxs从0开始。MODE和stat见如下对照表,需要你自己实现PULL_STAT枚举型

{

    /IO配置对照,4bit一个引脚(y)

     高2位(CNFy):

    输入  00=模拟,01=浮空,10=上/下拉,11=保留

    输出        [推挽] [开漏]

           [通用]  00     01

        [复用]  10     11

     低2位(MODEy):

     输入  00

     输出  01=10MHz,10=2MHz,11=50MHz

    /

GPIO_TypeDef GPIOs[] = {GPIOA,GPIOB,GPIOC,GPIOD,GPIOE,GPIOF,GPIOG};

MODE|=stat<<2;

if(PINxs>15)

{

PINxs -= 8;

GPIOs[PORTx]->CRH = MODE<<(PINxs4);

}

else

{

GPIOs[PORTx]->CRL = MODE<<(PINxs4);

}

}

  至于

void set_PINxs(u32 PORTx, u32 PINxs, PIN_VAL val)

{

}

  可以用位带实现,如下:

  保存为systemh

#ifndef __SYS_H

#define __SYS_H

#include "stm32f10xh" 

//0,不支持ucos

//1,支持ucos

#define SYSTEM_SUPPORT_UCOS 0 //定义系统文件夹是否支持UCOS

    

 

//位带 *** 作,实现51类似的GPIO控制功能

//具体实现思想,参考<<CM3权威指南>>第五章(87页~92页)

//IO口 *** 作宏定义

#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) 

#define MEM_ADDR(addr)  ((volatile unsigned long  )(addr)) 

#define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum)) 

//IO口地址映射

#define GPIOA_ODR_Addr    (GPIOA_BASE+12) //0x4001080C 

#define GPIOB_ODR_Addr    (GPIOB_BASE+12) //0x40010C0C 

#define GPIOC_ODR_Addr    (GPIOC_BASE+12) //0x4001100C 

#define GPIOD_ODR_Addr    (GPIOD_BASE+12) //0x4001140C 

#define GPIOE_ODR_Addr    (GPIOE_BASE+12) //0x4001180C 

#define GPIOF_ODR_Addr    (GPIOF_BASE+12) //0x40011A0C    

#define GPIOG_ODR_Addr    (GPIOG_BASE+12) //0x40011E0C    

#define GPIOA_IDR_Addr    (GPIOA_BASE+8) //0x40010808 

#define GPIOB_IDR_Addr    (GPIOB_BASE+8) //0x40010C08 

#define GPIOC_IDR_Addr    (GPIOC_BASE+8) //0x40011008 

#define GPIOD_IDR_Addr    (GPIOD_BASE+8) //0x40011408 

#define GPIOE_IDR_Addr    (GPIOE_BASE+8) //0x40011808 

#define GPIOF_IDR_Addr    (GPIOF_BASE+8) //0x40011A08 

#define GPIOG_IDR_Addr    (GPIOG_BASE+8) //0x40011E08 

 

//IO口 *** 作,只对单一的IO口!

//确保n的值小于16!

#define PAout(n)   BIT_ADDR(GPIOA_ODR_Addr,n)  //输出 

#define PAin(n)    BIT_ADDR(GPIOA_IDR_Addr,n)  //输入 

#define PBout(n)   BIT_ADDR(GPIOB_ODR_Addr,n)  //输出 

#define PBin(n)    BIT_ADDR(GPIOB_IDR_Addr,n)  //输入 

#define PCout(n)   BIT_ADDR(GPIOC_ODR_Addr,n)  //输出 

#define PCin(n)    BIT_ADDR(GPIOC_IDR_Addr,n)  //输入 

#define PDout(n)   BIT_ADDR(GPIOD_ODR_Addr,n)  //输出 

#define PDin(n)    BIT_ADDR(GPIOD_IDR_Addr,n)  //输入 

#define PEout(n)   BIT_ADDR(GPIOE_ODR_Addr,n)  //输出 

#define PEin(n)    BIT_ADDR(GPIOE_IDR_Addr,n)  //输入

#define PFout(n)   BIT_ADDR(GPIOF_ODR_Addr,n)  //输出 

#define PFin(n)    BIT_ADDR(GPIOF_IDR_Addr,n)  //输入

#define PGout(n)   BIT_ADDR(GPIOG_ODR_Addr,n)  //输出 

#define PGin(n)    BIT_ADDR(GPIOG_IDR_Addr,n)  //输入

//void NVIC_Configuration(void);

#endif

  使用时直接:

PAout(0) = 0;

//或

a = PAin(0);

  当然,你还可以使用STM32的库函数

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/12183121.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存