STM32F446 SAI blockA和blockB配置为从模式,如果MCU先启动SAI,再打开音频芯片SAI时钟信号,此时MCU不能进入DMA中断,采集不到数据。保持音频SAI接口时钟正常输出,用Jlink重新复位一下MCU,SAI接口的数据采集和发送才正常。不知道这个问题是什么原因。
解决方法有2种:1.MCU启动先不使能SAI,把音频芯片SAI时钟打开后再启动MCU SAI;2.把MCU的SAI配置为主模式。
但是对于这个问题还是感到很奇怪。
STM32F446 SAI blockA和blockB配置为从模式,如果MCU先启动SAI,再打开音频芯片SAI时钟信号,此时MCU不能进入DMA中断,采集不到数据。保持音频SAI接口时钟正常输出,用Jlink重新复位一下MCU,SAI接口的数据采集和发送才正常。不知道这个问题是什么原因。
解决方法有2种:1.MCU启动先不使能SAI,把音频芯片SAI时钟打开后再启动MCU SAI;2.把MCU的SAI配置为主模式。
但是对于这个问题还是感到很奇怪。
不要使用赋值方法清零。对于16位数组,或者32位数组,赋值清零并没有把所有位都置零。
int32_t mix_data_new[SAI_SLOTS_SIZE][2] = {0};
#if 0
for (j = 0; j < 2; j++)
{
for (k = 0; k < SAI_SLOTS_SIZE; k++)
{
mix_data_new[j][k] = 0;
}
}
#endif
使用memset清零,可以确保每个数组中的每一位都被清零。
memset(mix_data_new, 0, sizeof(mix_data_new));
第1段:
int16_t data;
const char pcm_data2[] = {…};data = pcm_data2[i];
data += pcm_data2[i+1]<<8;
第2段:
data = ((int16_t)pcm_data2[i+1] << 8 + pcm_data2[i]);
很奇怪,上面2段代码,在STM32F401上用MDK编译出来执行的结果不一样。第1段执行出来的结果是正确的,第2段执行出来的结果是错误的,并且不知道是怎么算出来的。
原文链接:http://yzsijin.cn/2020/09/12/openssl%E4%BA%A4%E5%8F%89%E7%BC%96%E8%AF%91/
config 和 Configure 的区别
Configure 需要指定平台信息,比如像上面那样直接指定是 arm 平台,则 Makefile 中也就不会出现 m64 选项,不需要像 config 那样再手动去修改 Makefile 脚本。而 config 则是自己去检测当前的系统环境,自动识别系统内核信息和编译器并设定参数等,然后将相关选项再传递给 Configure 脚本去完成最终配置。
而交叉编译的时候基本就会存在问题,所有更推荐使用 Configure 方式来进行配置操作。但 Configure 需要自己指定目标平台信息,这个可以通过将 config 脚本放置目标平台,然后通过 ./config -t 命令来查看其检测显示的对应平台信息,如下:
image
最后会显示 ./Configure linux-armv4
补充说明下,配置操作改写和生成 opensslconf.h 和 opensslv.h 头文件,opensslv.h 主要记录当前库使用的版本信息,而 opensslconf.h 则主要显示编译 openssl 库时的选项配置情况。
原文链接:https://www.cnblogs.com/shangdawei/p/4756415.html
NSS分为内部引脚和外部引脚。
NSS外部引脚可以作为输入信号或者输出信号,
输入信号一般用作硬件方式从机的片选,
而输出信号一般用于主SPI去片选与之相连的从SPI。
NSS从设备选择有两种模式:
1、软件模式
可以通过设置SPI_CR1寄存器的SSM位来使能这种模式,当它为1时,NSS引脚上的电平由SSI决定。
在这种模式下NSS外部引脚可以用作它用,而内部NSS信号电平可以通过写SPI_CR1的SSI位来驱动。
2、硬件模式两种方式:
(1)对于主SPI,NSS可以直接接高电平,对于从SPI,可以直接接低电平。
(2)当STM32F10xxx工作为主SPI,并且NSS输出已经通过SPI_CR2寄存器的SSOE位使能,
这时主机的NSS讲作为输出信号,引脚信号被拉低,所有NSS引脚与这个主SPI的NSS引脚相连
并配置为硬件NSS的STM32F10xxx SPI设备,将自动变成从SPI设备。
此时两个的NSS信号线可以接个上拉电阻直连。
原文链接:https://www.cnblogs.com/kerrycode/p/3759395.html
有时候需要查看Linux系统运行了多久时间,此时需要知道上次开机启动时间; 有时候由于断电或供电故障突然停机,需要查看Linux开机时间/重启时间; 下面总结一些查看Linux开机关机时间的方法(非常全面)
1: who 命令查看
who -b 查看最后一次系统启动的时间。
who -r 查看当前系统运行时间
[root@DB-Server ~]# who -b
system boot May 11 09:27
原文链接:https://www.cnblogs.com/pcat/p/5467188.html
在linux里,source、sh、bash、./都可以执行shell script文件,那它们有什么不同吗?
———–
1、source
source a.sh在当前shell内去读取、执行a.sh,而a.sh不需要有”执行权限”
source命令可以简写为”.”
. a.sh注意:中间是有空格的。
原文链接:https://blog.csdn.net/niepangu/article/details/49443557
STM32在使用时有时需要禁用全局中断,比如MCU在升级过程中需禁用外部中断,防止升级过程中外部中断触发导致升级失败。
ARM MDK中提供了如下两个接口来禁用和开启总中断:
__disable_irq(); // 关闭总中断
__enable_irq(); // 开启总中断
但测试发现这样一个问题,在关闭总中断后,如果有中断触发,虽然此时不会引发中断,但在调用__enable_irq()开启总中断后,MCU会立即处理之前触发的中断。这说明__disable_irq()只是禁止CPU去响应中断,没有真正的去屏蔽中断的触发,中断发生后,相应的寄存器会将中断标志置位,在__enable_irq()开启中断后,由于相应的中断标志没有清空,因而还会触发中断。所以要想禁止所有中断,必须对逐个模块的中断进行Disable操作,由于每个模块中断源有很多,对逐个中断Disable的话比较复杂,较为简单的方法是通过XXX_ClearITPendingBit()清除中断标志或者直接通过XXX_DeInit()来清除寄存器的状态。这样在__enable_irq()开启总中断后,MCU就不会响应之前触发的中断了。
参考链接:
ONVIF协议网络摄像机(IPC)客户端程序开发(6):使用gSOAP生成ONVIF框架代码
Onvif开发之代码框架生成篇
一、使用本地的wsdl文件生成Onvif框架代码
1.下载wsdl文件并解压
下载地址1:python-onvif
下载地址2:wsdl_2.4.2.zip
2.下载gsoap并解压
下载地址1:gsoap.zip
下载地址2:gsoap_2.8.103.zip
3.把解压后的wsdl文件拷贝到gsoap-2.8\gsoap目录下
4.把gsoap-2.8\gsoap\bin目录中的wsdl2h.exe、soapcpp2.exe文件拷贝到gsoap-2.8\gsoap目录下
5.使用wsdl2h工具,根据WSDL生成onvif.h头文件
wsdl2h -c -s -t typemap.dat -o onvif.h remotediscovery.wsdl devicemgmt.wsdl analytics.wsdl analyticsdevice.wsdl
media.wsdl deviceio.wsdl display.wsdl event.wsdl imaging.wsdl recording.wsdl replay.wsdl search.wsdl receiver.wsdl ptz.wsdl
继续阅读