使用python脚本生成STM32点灯代码

一、简介。

有的时候,一个按键板接了很多个灯,一个IO驱动一个灯。

此时,需要注意单片机一个IO的拉/灌电流以及全部IO的总拉/灌电流,是否超过手册上的拉/灌电流的规定。

要是灯的个数太多,建议增加三极管,把拉/灌电流分到三极管上,这样,单片机就会比较稳定。

但是灯太多,会造成很多重复劳动,这里使用使用python脚本生成STM32点灯代码。

二、使用方法。

1、在pins.txt中定义LED号及其引脚号。

2、运行autoHead.py,即可生成led.h。

3、配置LED亮灯电平

再运行autoC.py,即可生成led.c。

三、pins.txt。

LED1->PG8
LED2->PE5
LED3->PB0
LED4->PE14
LED5->PF12
LED6->PC6
LED7->PG3
LED8->PA7
LED9->PE13
LED10->PF11
LED11->PC11
LED12->PG2
LED13->PB10
LED14->PA1
LED15->PB2
LED16->PE4
LED17->PD9
LED18->PE15
LED19->PF13
LED20->PB1
LED21->PC7
LED22->PC8
LED23->PB6
LED24->PB8
LED25->PF3
LED26->PF0
LED27->PB13
LED28->PB14
LED29->PE8
LED30->PE7
LED31->PC9
LED32->PA8
LED33->PG4
LED34->PG5
LED35->PF2
LED36->PF1
LED37->PC5
LED38->PC4
LED39->PG0
LED40->PG1
LED41->PD12
LED42->PD13
LED43->PB4
LED44->PB5
LED45->PA15
LED46->PC10
LED47->PB15
LED48->PD8
LED49->PE9
LED50->PE10
LED51->PG14
LED52->PB3
LED53->PG7
LED54->PG6
LED55->PD11
LED56->PD10
LED57->PE11
LED58->PE12
LED59->PF14
LED60->PF15

四、autoHead.py。

# 读取pins.txt文件中的引脚信息
fin = open('./pins.txt')
read_content = fin.read()
fin.close()

# 计算pins.txt的行数,行数即是LED个数
spice = read_content.split("\n")
total_num = len(spice)

# 打印led.h的内容
fout = open('./led.h','w')

write_content = """#ifndef __LED_H
#define __LED_H

#include "stm32f10x.h"

typedef enum {
	LED_ON = 0, LED_OFF = 1
} LED_STATUS;

typedef enum {
"""

for i in range(1,total_num+1):
   write_content += "\tLED"+str(i)+",\n"

write_content += """
   LED_ALL
} LED_NUM;

void LED_Config(void);
void LED_Ctrl(LED_NUM num,LED_STATUS status);

#endif
"""

fout.write(write_content)
fout.close()

五、autoC.py。

# 设置电平,高电平亮=1,低电平亮=0
level = 1

# 读取pins.txt文件中的引脚信息
fin = open('./pins.txt')
read_content = fin.read()
fin.close()

# 计算pins.txt的行数,行数即是LED个数
spice = read_content.split("\n")
total_num = len(spice)

# 打印led.c的内容
fout = open('./led.c','w')

write_content = """#include "led.h"

void LED_Config(void) {
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE);
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
"""

for i in range(0,total_num) :
    line = spice[i].split("->")
    pin = line[1]
    bank = pin[1]
    num = pin[2:]
    if(level == 1) :
        write_content += "\n\tGPIO_InitStructure.GPIO_Pin = GPIO_Pin_"+num+";\n\
\tGPIO_Init(GPIO"+bank+", &GPIO_InitStructure);\n\
\tGPIO_ResetBits(GPIO"+bank+", GPIO_Pin_"+num+");\n"
    else :
        write_content += "\n\tGPIO_InitStructure.GPIO_Pin = GPIO_Pin_"+num+";\n\
\tGPIO_Init(GPIO"+bank+", &GPIO_InitStructure);\n\
\tGPIO_SetBits(GPIO"+bank+", GPIO_Pin_"+num+");\n"

write_content +="}\n\nvoid LED_Ctrl(LED_NUM num,LED_STATUS status) {\n"

for i in range(0,total_num) :
    line = spice[i].split("->")
    led = line[0]
    pin = line[1]
    bank = pin[1]
    num = pin[2:]
    if(i==0):
        if(level == 1) :
            write_content += "\tif (num == "+led+") { // "+pin+"\n\
        if (status == LED_ON) {\n\
            GPIO_SetBits(GPIO"+bank+", GPIO_Pin_"+num+");\n\
        } else {\n\
            GPIO_ResetBits(GPIO"+bank+", GPIO_Pin_"+num+");\n\
        }"
        else :
            write_content += "\tif (num == "+led+") {// "+pin+"\n\
        if (status == LED_ON) {\n\
            GPIO_ResetBits(GPIO"+bank+", GPIO_Pin_"+num+");\n\
        } else {\n\
            GPIO_SetBits(GPIO"+bank+", GPIO_Pin_"+num+");\n\
        }"
    else :
        if(level == 1) :
            write_content += "\n\t} else if (num == "+led+") { // "+pin+"\n\
		if (status == LED_ON) {\n\
			GPIO_SetBits(GPIO"+bank+", GPIO_Pin_"+num+");\n\
		} else {\n\
			GPIO_ResetBits(GPIO"+bank+", GPIO_Pin_"+num+");\n\
		}"
        else :
            write_content += "\n\t} else if (num == "+led+") { // "+pin+"\n\
		if (status == LED_ON) {\n\
			GPIO_ResetBits(GPIO"+bank+", GPIO_Pin_"+num+");\n\
		} else {\n\
			GPIO_SetBits(GPIO"+bank+", GPIO_Pin_"+num+");\n\
		}"

write_content += "\n\t} else { // LED_ALL \n\t\tif (status == LED_ON) {"

for i in range(0,total_num) :
    line = spice[i].split("->")
    pin = line[1]
    bank = pin[1]
    num = pin[2:]
    if(level == 1) :
        write_content += "\n\t\t\tGPIO_SetBits(GPIO"+bank+", GPIO_Pin_"+num+");"
    else :
        write_content += "\n\t\t\tGPIO_ResetBits(GPIO"+bank+", GPIO_Pin_"+num+");"

write_content += "\n\t\t} else {"

for i in range(0,total_num) :
    line = spice[i].split("->")
    pin = line[1]
    bank = pin[1]
    num = pin[2:]
    if(level == 1) :
        write_content += "\n\t\t\tGPIO_ResetBits(GPIO"+bank+", GPIO_Pin_"+num+");"
    else :
        write_content += "\n\t\t\tGPIO_SetBits(GPIO"+bank+", GPIO_Pin_"+num+");"

write_content += "\n\t\t}\n\t}\n}"

fout.write(write_content)
fout.close()

六、其它问题。

1、使用pyCharm编译生成的文件,在keil中编译成功、在STM32F103ZET6上测试成功。

2、请严格遵循pins.txt的格式,不要增加空行。

 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值