【移远QuecPython】EC800M物联网开发板的硬件TIM定时器精准延时

【移远QuecPython】EC800M物联网开发板的硬件TIM定时器精准延时


首先 这个定时器是硬件底层级别的 优先级最高 如果调用 会导致GNSS等线程被占用 从而无法获取数据

导入库

from machine import Timer

定时器初始化

timer.start(period, mode, callback)

该方法用于启动定时器。

参数描述:

period - 中断周期,int类型,单位毫秒,大于等于1。

mode - 运行模式,int类型,说明如下:
ONE_SHOT - 单次模式,定时器只执行一次
PERIODIC - 周期模式,循环执行

callback - 定时器执行函数,function类型,原型为callback(arg),arg未实际使用,可直接传入None。callback函数触发后,必须调用stop接口停止该定时器,否则下次调用start接口后,callback不会被执行。

返回值描述:

启动成功返回整型值0,失败返回整型值-1。

延时函数

TIM0=Timer(Timer.Timer0)
TIM0_Flag=0
def Delay_ms(ms):
    global TIM0_Flag
    TIM0_Flag=0
    TIM0.start(period=ms, mode=Timer.ONE_SHOT, callback=TIM0_Callback)
    while TIM0_Flag==0:
        if TIM0_Flag==1:
            break
        pass
    TIM0_Flag=0

配置为一次性工作模式 等待中断产生

定时中断回调

def TIM0_Callback(arg):
    global TIM0_Flag
    TIM0_Flag=1
    TIM0.stop()

中断产生则关闭定时器

调用

Delay_ms(50)

函数打包

# -*- coding: utf-8 -*-
from misc import PWM_V2
from machine import Pin
import usr.Delay as Delay

C0 = 1635159
Db0 = 1732391
D0 = 1835404
Eb0 = 1944543
E0 = 2060172
F0 = 2182676
Gb0 = 2312465
G0 = 2449971
Ab0 = 2595654
A0 = 2750000
Bb0 = 2913523
B0 = 3086770

C1 = 3270319
Db1 = 3464782
D1 = 3670809
Eb1 = 3889087
E1 = 4120344
F1 = 4365352
Gb1 = 4624930
G1 = 4899942
Ab1 = 5191308
A1 = 5500000
Bb1 = 5827047
B1 = 6173541

C2 = 6540639
Db2 = 6929565
D2 = 7341619
Eb2 = 7778174
E2 = 8240688
F2 = 8730705
Gb2 = 9249860
G2 = 9799885
Ab2 = 10382617
A2 = 11000000
Bb2 = 11654094
B2 = 12347082

C3 = 13081278
Db3 = 13859131
D3 = 14683238
Eb3 = 15556349
E3 = 16481377
F3 = 17461411
Gb3 = 18499721
G3 = 19599771
Ab3 = 20765234
A3 = 22000000
Bb3 = 23308188
B3 = 24694165

C4 = 26162556
Db4 = 27718263
D4 = 29366476
Eb4 = 31112698
E4 = 32962755
F4 = 34922823
Gb4 = 36999442
G4 = 39199543
Ab4 = 41530469
A4 = 44000000
Bb4 = 46616376
B4 = 49388330

C5 = 52325113
Db5 = 55436526
D5 = 58732953
Eb5 = 62225396
E5 = 65925511
F5 = 69845646
Gb5 = 73998884
G5 = 78399087
Ab5 = 83060939
A5 = 88000000
Bb5 = 93232752
B5 = 98776660

C6 = 104650226
Db6 = 110873052
D6 = 117465907
Eb6 = 124450793
E6 = 131851022
F6 = 139691292
Gb6 = 147997769
G6 = 156798174
Ab6 = 166121879
A6 = 176000000
Bb6 = 186465504
B6 = 197553320

C7 = 209300452
Db7 = 221746104
D7 = 234931814
Eb7 = 248901586
E7 = 263702045
F7 = 279382585
Gb7 = 295995538
G7 = 313596348
Ab7 = 332243758
A7 = 352000000
Bb7 = 372931009
B7 = 395106641

C8 = 418600904
Db8 = 443492209
D8 = 469863628
Eb8 = 497803173
E8 = 527404091
F8 = 558765170
Gb8 = 591991076
G8 = 627192697
Ab8 = 664487516
A8 = 704000000
Bb8 = 745862018
B8 = 790213282

C9 = 837201808
Db9 = 886984419
D9 = 939727257
Eb9 = 995606347
E9 = 1054808182
F9 = 1117530340
Gb9 = 1183982152
G9 = 1254385395
Ab9 = 1328975032
A9 = 1408000000
Bb9 = 1491724036
B9 = 1580426564


def Pitch_Play(pwm,pitch,s):
    pitch=pitch/100000
    pwm.open(pitch, 50)
    Delay.Delay_ms(int(s*950))
    pwm.close()
    Delay.Delay_ms(int(s*50))

def Pitch_Play_HB_Start(GPIO,V2_PWM):
    Pin(GPIO, Pin.OUT,Pin.PULL_PD,0)
    pwm=PWM_V2(V2_PWM, G5/100000, 50)
    Pitch_Play(pwm,G5,0.25)
    Pitch_Play(pwm,G5,0.25)
    Pitch_Play(pwm,A5,0.5)
    Pitch_Play(pwm,G5,0.5)
    Pitch_Play(pwm,C6,0.5)
    Pitch_Play(pwm,B5,0.5)

def Pitch_Play_HB_End(GPIO,V2_PWM):
    Pin(GPIO, Pin.OUT,Pin.PULL_PD,0)
    pwm=PWM_V2(V2_PWM, G5/100000, 50)
    Pitch_Play(pwm,F5,0.25)
    Pitch_Play(pwm,F5,0.25)
    Pitch_Play(pwm,E6,0.5)
    Pitch_Play(pwm,C6,0.5)
    Pitch_Play(pwm,D6,0.5)
    Pitch_Play(pwm,C6,0.5)

附录:列表的赋值类型和py打包

列表赋值

BUG复现

闲来无事写了个小程序 代码如下:

# -*- coding: utf-8 -*-
"""
Created on Fri Nov 19 19:47:01 2021

@author: 16016
"""

a_list = ['0','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15']
#print(len(a_list))
#b_list = ['','','','','','','','','','','','','','','','']
c_list = [[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]]
#for i in range(16):
if len(a_list):
    for j in range(16):
        a_list[j]=str(a_list[j])+'_'+str(j)
        print("序号:",j)
        print('a_list:\n',a_list)
        
        
        c_list[j]=a_list
        print('c_list[0]:\n',c_list[0])
        print('\n')
#        b_list[j]=a_list[7],a_list[8]
#        print(b_list[j])
        # 写入到Excel:
#print(c_list,'\n')    

我在程序中 做了一个16次的for循环 把列表a的每个值后面依次加上"_"和循环序号
比如循环第x次 就是把第x位加上_x 这一位变成x_x 我在输出测试中 列表a的每一次输出也是对的
循环16次后列表a应该变成[‘0_0’, ‘1_1’, ‘2_2’, ‘3_3’, ‘4_4’, ‘5_5’, ‘6_6’, ‘7_7’, ‘8_8’, ‘9_9’, ‘10_10’, ‘11_11’, ‘12_12’, ‘13_13’, ‘14_14’, ‘15_15’] 这也是对的

同时 我将每一次循环时列表a的值 写入到空列表c中 比如第x次循环 就是把更改以后的列表a的值 写入到列表c的第x位
第0次循环后 c[0]的值应该是[‘0_0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’, ‘10’, ‘11’, ‘12’, ‘13’, ‘14’, ‘15’] 这也是对的
但是在第1次循环以后 c[0]的值就一直在变 变成了c[x]的值
相当于把c_list[0]变成了c_list[1]…以此类推 最后得出的列表c的值也是每一项完全一样
我不明白这是怎么回事
我的c[0]只在第0次循环时被赋值了 但是后面它的值跟着在改变

如图:
在这里插入图片描述
第一次老出bug 赋值以后 每次循环都改变c[0]的值 搞了半天都没搞出来
无论是用appen函数添加 还是用二维数组定义 或者增加第三个空数组来过渡 都无法解决

代码改进

后来在我华科同学的指导下 突然想到赋值可以赋的是个地址 地址里面的值一直变化 导致赋值也一直变化 于是用第二张图的循环套循环深度复制实现了

代码如下:

# -*- coding: utf-8 -*-
"""
Created on Fri Nov 19 19:47:01 2021

@author: 16016
"""

a_list = ['0','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15']
#print(len(a_list))
#b_list = ['','','','','','','','','','','','','','','','']
c_list = [[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]]
#for i in range(16):
if len(a_list):
    for j in range(16):
        a_list[j]=str(a_list[j])+'_'+str(j)
        print("序号:",j)
        print('a_list:\n',a_list)
        
        
        for i in range(16):
            c_list[j].append(a_list[i])
        print('c_list[0]:\n',c_list[0])
        print('\n')
#        b_list[j]=a_list[7],a_list[8]
#        print(b_list[j])
        # 写入到Excel:
print(c_list,'\n')    

解决了问题

在这里插入图片描述

优化

第三次是请教了老师 用copy函数来赋真值

代码如下:

# -*- coding: utf-8 -*-
"""
Created on Fri Nov 19 19:47:01 2021

@author: 16016
"""

a_list = ['0','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15']
#print(len(a_list))
#b_list = ['','','','','','','','','','','','','','','','']
c_list = [[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]]
#for i in range(16):
if len(a_list):
    for j in range(16):
        a_list[j]=str(a_list[j])+'_'+str(j)
        print("序号:",j)
        print('a_list:\n',a_list)
        
        
        c_list[j]=a_list.copy()
        print('c_list[0]:\n',c_list[0])
        print('\n')
#        b_list[j]=a_list[7],a_list[8]
#        print(b_list[j])
        # 写入到Excel:
#print(c_list,'\n')    

同样能解决问题
在这里插入图片描述
最后得出问题 就是指针惹的祸!

a_list指向的是个地址 而不是值 a_list[i]指向的才是单个的值 copy()函数也是复制值而不是地址

如果这个用C语言来写 就直观一些了 难怪C语言是基础 光学Python不学C 遇到这样的问题就解决不了

C语言yyds Python是什么垃圾弱智语言

总结

由于Python无法单独定义一个值为指针或者独立的值 所以只能用列表来传送
只要赋值是指向一个列表整体的 那么就是指向的一个指针内存地址 解决方法只有一个 那就是将每个值深度复制赋值(子列表内的元素提取出来重新依次连接) 或者用copy函数单独赋值

如图测试:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
部分代码:

# -*- coding: utf-8 -*-
"""
Created on Sat Nov 20 16:45:48 2021

@author: 16016
"""

def text1():
    A=[1,2,3]
    B=[[],[],[]]
    for i in range(len(A)):
        A[i]=A[i]+i
        B[i]=A
        print(B)

def text2():
    A=[1,2,3]
    B=[[],[],[]]
    
    A[0]=A[0]+0
    B[0]=A
    print(B)
    A[1]=A[1]+1
    B[1]=A
    print(B)
    A[2]=A[2]+2
    B[2]=A
    print(B)
    
if __name__ == '__main__':
    text1()
    print('\n')
    text2()

py打包

Pyinstaller打包exe(包括打包资源文件 绝不出错版)

依赖包及其对应的版本号

PyQt5 5.10.1
PyQt5-Qt5 5.15.2
PyQt5-sip 12.9.0

pyinstaller 4.5.1
pyinstaller-hooks-contrib 2021.3

Pyinstaller -F setup.py 打包exe

Pyinstaller -F -w setup.py 不带控制台的打包

Pyinstaller -F -i xx.ico setup.py 打包指定exe图标打包

打包exe参数说明:

-F:打包后只生成单个exe格式文件;

-D:默认选项,创建一个目录,包含exe文件以及大量依赖文件;

-c:默认选项,使用控制台(就是类似cmd的黑框);

-w:不使用控制台;

-p:添加搜索路径,让其找到对应的库;

-i:改变生成程序的icon图标。

如果要打包资源文件
则需要对代码中的路径进行转换处理
另外要注意的是 如果要打包资源文件 则py程序里面的路径要从./xxx/yy换成xxx/yy 并且进行路径转换
但如果不打包资源文件的话 最好路径还是用作./xxx/yy 并且不进行路径转换

def get_resource_path(relative_path):
    if hasattr(sys, '_MEIPASS'):
        return os.path.join(sys._MEIPASS, relative_path)
    return os.path.join(os.path.abspath("."), relative_path)

而后再spec文件中的datas部分加入目录
如:

a = Analysis(['cxk.py'],
             pathex=['D:\\Python Test\\cxk'],
             binaries=[],
             datas=[('root','root')],
             hiddenimports=[],
             hookspath=[],
             hooksconfig={
    
    },
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)

而后直接Pyinstaller -F setup.spec即可

如果打包的文件过大则更改spec文件中的excludes 把不需要的库写进去(但是已经在环境中安装了的)就行

这些不要了的库在上一次编译时的shell里面输出
比如:
在这里插入图片描述

在这里插入图片描述
然后用pyinstaller --clean -F 某某.spec

猜你喜欢

转载自blog.csdn.net/weixin_53403301/article/details/134397208