- 2023-11-27
-
回复了主题帖:
又一RTOS及组建开源啦!!免费商用,有想玩的吗?
这个就无敌了,大杂烩的掘墓者
- 2023-11-21
-
发表了主题帖:
【DigiKey“智造万物,快乐不停”创意大赛】3、实现串口发送数据到matlab
首先实现将串口数据发送到matlab进行后续分析,后续再研究通过以太网等更加高速的方法。
matlab测试代码
%stopasync(arduinoObj);
%fclose(arduinoObj);
%delete(arduinoObj);
arduinoObj = serialport("COM6",115200,ByteOrder="big-endian")
%configureTerminator(arduinoObj,"CR/LF");
flush(arduinoObj);
%准备 UserData 属性来存储 Arduino 数据。结构体的 Data 字段保存正弦波值,Count 字段保存正弦波的 x 轴值。
arduinoObj.UserData = struct("Data",[],"Count",1)
%创建一个回调函数 readSineWaveData,它读取前 1000 个以 ASCII 字符结尾的正弦波数据点并绘制结果。
%configureCallback(arduinoObj,"terminator",@readSineWaveData);
configureCallback(arduinoObj,"byte",256*4,@readSineWaveData)
function readSineWaveData(src, ~)
% Read the ASCII data from the serialport object.
data = read(src,256,"uint32");
disp(num2str(data));
% Convert the string data to numeric type and save it in the UserData
% property of the serialport object.
%src.UserData.Data(end+1) = str2double(data);
% Update the Count value of the serialport object.
%src.UserData.Count = src.UserData.Count + 1;
% If 1001 data points have been collected from the Arduino, switch off the
% callbacks and plot the data.
%if src.UserData.Count > 52
%configureCallback(src, "off");
%plot(src.UserData.Data(2:end));
%end
end
2023版本matlab的串口通信使用非常方便,比以前的智能多了,可以直接选数据大小端
- 2023-11-13
-
上传了资料:
Keil.STM32U5xx_DFP.2.1.0
- 2023-11-10
-
发表了主题帖:
【DigiKey“智造万物,快乐不停”创意大赛】2、扩展板的设计
本次大赛设计了arduino接口的扩展板,各个电路模块均采用模块化的设计,方便DIY玩法。
- 2023-11-05
-
发表了主题帖:
【MSPM0L1306 LaunchPad】8、pwm呼吸灯
本帖最后由 dql2016 于 2023-11-5 22:02 编辑
呼吸灯是很多产品常见的设计,尤其是低端产品没有液晶显示屏通过LED来显示工作状态。
使用CCS配置PWM输出十分简单,首先选择例程:
看看demo说明
PWM的配置,主要是定时器时钟和分频系数、装载值的设置:
输出管脚连接了LED:
程序,十分简洁易懂:
#include "ti_msp_dl_config.h"
int pwm_count = 1800; // initial ccr count based on 10% duty cycle
int dc = 10; // initialized to 10 % duty cycle
int mode = 1; // 1 = up (will indicate you need to increase dc), 0 = down (will
// decrease dc)
int main(void) {
SYSCFG_DL_init();
NVIC_EnableIRQ(PWM_0_INST_INT_IRQN);
DL_TimerG_startCounter(PWM_0_INST);
while (1) {
__WFI();
}
}
void PWM_0_INST_IRQHandler(void) {
switch (DL_TimerG_getPendingInterrupt(PWM_0_INST)) {
case DL_TIMER_IIDX_LOAD:
if (dc <= 10) {
mode = 1;
} // if reached lowest dc (10%), increase dc
else if (dc >= 90) {
mode = 0;
} // if reached highest dc (90%), decrease dc
if (mode) {
pwm_count -= 20;
dc += 1;
} // up
if (!mode) {
pwm_count += 20;
dc -= 1;
} // down
DL_TimerG_setCaptureCompareValue(PWM_0_INST, pwm_count,
DL_TIMER_CC_1_INDEX); // update ccr1 value
break;
default:
break;
}
}
效果:
-
发表了主题帖:
【MSPM0L1306 LaunchPad】7、pwm的应用
MSPM0L1306 内置了四个 16 位通用计时器,每个计时器具有两个捕 捉/比较寄存器,支持待机模式下的低功耗运 行,总共支持 8 个 PWM 通道,可以通过产生SPWM信号经过低通滤波后得到正弦信号。定时器主要特性如下:
打开CCS,选择PWM例程:
PWM的配置,十分简单:
外部输出管脚配置:
程序说明,通过查SPWM正弦表方式,定时输出PWM值:
#include "ti_msp_dl_config.h"
/* Array of 128 samples to select duty cycles to generate sine waveform for 1024 Period count (10 bit DAC resolution) */
#define ARRAY_SIZE 128
uint16_t gSine128[ARRAY_SIZE] = {
512,537,562,587,611,636,660,684,
707,730,753,774,796,816,836,855,
873,890,907,922,937,950,963,974,
984,993,1001,1008,1013,1017,1021,1022,
1023,1022,1021,1017,1013,1008,1001,993,
984,974,963,950,937,922,907,890,
873,855,836,816,796,774,753,730,
707,684,660,636,611,587,562,537,
512,486,461,436,412,387,363,339,
316,293,270,249,227,207,187,168,
150,133,116,101,86,73,60,49,
39,30,22,15,10,6,2,1,
0,1,2,6,10,15,22,30,
39,49,60,73,86,101,116,133,
150,168,187,207,227,249,270,293,
316,339,363,387,412,436,461,486};
/* Counter used to cycle through sine array */
volatile uint32_t gSineCounter = 0;
int main(void)
{
SYSCFG_DL_init();
/* Enable PWM interrupts */
NVIC_EnableIRQ(PWM_0_INST_INT_IRQN);
/* Start PWM counter */
DL_TimerG_startCounter(PWM_0_INST);
while(1){
__WFI();
}
}
void PWM_0_INST_IRQHandler(void){
switch (DL_TimerG_getPendingInterrupt(PWM_0_INST)){
case DL_TIMERG_IIDX_CC0_DN: /* Interrupt on CC0 Down Event */
/* Set new Duty Cycle based on sine array sample value */
DL_TimerG_setCaptureCompareValue(PWM_0_INST, gSine128[gSineCounter%128], DL_TIMER_CC_0_INDEX);
/* Increment gSineCounter value */
gSineCounter++;
break;
default:
break;
}
}
PA10脚原始输出信号如下:
- 2023-11-04
-
回复了主题帖:
求国产低噪声负输入LDO
秦天qintian0303 发表于 2023-11-4 09:31
负电压一般不是直接用电荷泵了吗?
纹波大,后面挂LDO好点
-
回复了主题帖:
公司里的两个极限卷王
还不换?
- 2023-11-03
-
回复了主题帖:
〖碎碎念〗良心、责任与苦差
世界上只有一种病:穷病
-
回复了主题帖:
46“万里”树莓派小车——PicoW学习(PWM、定时器)
这玩意咋不用arduino或者micropython玩玩,很方便,比C简单
-
发表了主题帖:
【得捷电子Follow me第2期】自定义任务:esp32控制放大器
在第二期的活动中为了凑单买了XIAO ESP32C3,支持arduino开发,十分方便,尺寸也十分的mini,板子带了锂电池充电芯片,可玩性非常高。
通过SPI接口驱动AD5270这款数字电位器,来调整仪表放大器的增益,从而实现程控增益,测试代码如下:
// AD5270 commands - new digital potentiometer
#define CMD_WR_RDAC 0x01
#define CMD_RD_RDAC 0x02
#define CMD_ST_RDAC 0x03
#define CMD_RST 0x04
#define CMD_RD_MEM 0x05
#define CMD_RD_ADDR 0x06
#define CMD_WR_CTRL 0x07
#define CMD_RD_CTRL 0x08
#define CMD_SHTDN 0x09
void vspi_write_word(const int chip_select, uint16_t data_to_send, const uint8_t bit_order, const uint8_t mode) {
vspi->beginTransaction(SPISettings(SPI_FREQ_FAST, bit_order, mode));
digitalWrite(chip_select, LOW); //pull SS slow to prep other end for transfer
vspi->transfer16(data_to_send);
digitalWrite(chip_select, HIGH); //pull ss high to signify end of data transfer
vspi->endTransaction();
}
/* Write a 4-bit command and a 10-bit data word */
void AD5270_Write(const int chip_select, uint8_t cmd, uint16_t data){
uint16_t data_word = ((cmd & 0x0F) << 10) | (data & 0x03FF);
vspi_write_word(chip_select, data_word, MSBFIRST, SPI_MODE1);
}
/* Enable/disable rheostat value changes */
void AD5270_LockUnlock(const int chip_select, uint8_t lock){
AD5270_Write(chip_select, CMD_WR_CTRL, lock ? 0 : 0x002);
}
/* Enable/disable hardware shutdown */
void AD5270_Shutdown(const int chip_select, uint8_t shutdown){
AD5270_Write(chip_select, CMD_SHTDN, shutdown ? 1 : 0);
}
/* Set the value of the digital rheostat - range is 0-0x3FF (0-100kOhm) */
void AD5270_Set(const int chip_select, uint16_t val)
{
AD5270_Write(chip_select, CMD_WR_RDAC, val);
}
#define CHIP_SEL_MEAS 10 // Chip select pin for measuring digital rheostat potentiometer
void setup() {
// put your setup code here, to run once:
// Set voltage measurement gain to 1 (maximum current (5V pk-pk) must be within ADC range)
AD5270_Shutdown(CHIP_SEL_MEAS, 1);
AD5270_Set(CHIP_SEL_MEAS, 100);
}
void loop() {
// put your main code here, to run repeatedly:
}
开发板支持wifi功能,可以实现分布式的数据采集,非常强大。
[localvideo]8f305406291505a61886a3816a379689[/localvideo]
-
发表了主题帖:
【MSPM0L1306 LaunchPad】6、adc简单使用
MSPM0L1306内置一个ADC,支持10个外部通道,12位分辨率,单端输入,采样率高达1.68MSPS,采集一些简单的模拟输出传感器信号足够使用了。
ADC支持1个内部温度测量通道,支持连接到内部运算放大器,十分强大,还支持外部参考电压输入以提高精度。主要特性在官方的数据手册介绍的十分详细了:
打开CCS,新建一个工程
选择adc例子,在它基础上修改
例子说明
简单修改,支持printf输出
上面分别是接到3.3V个GND输出效果
-
回复了主题帖:
来看拆解!是怎样的智商税产品让管管大半夜狂笑出声
说明人傻钱多的人挺多的:)
-
回复了主题帖:
先进大厂赚钱,再考公务员是当下最优的选择吗?
这群人带坏了风气。赚钱的时候使劲卷
- 2023-10-31
-
发表了主题帖:
【玄铁杯第三届RISC-V应用创新大赛】1、开箱
很高兴参与这个活动,体验国产派。
首先放上官方的板卡介绍:
https://wiki.sipeed.com/hardware/zh/lichee/th1520/lpi4a/1_intro.html
后续会经常访问官方,学习教程、避坑。
开发板包装十分nice,贴心的使用了塑料盒,要是附带一个壳子就完美了
板卡正面,各种高端接口一应俱全
装上散热风扇
来自官方的介绍,可见是对标树莓派4的存在:
LicheePi 4A 是基于 Lichee Module 4A 核心板的 高性能 RISC-V Linux 开发板,以 TH1520 为主控核心(4xC910@1.85G, RV64GCV,4TOPS@Int8 NPU, 50GFLOP GPU),板载最大 16GB 64bit LPDDR4X,128GB eMMC,支持 HDMI+MIPI 双4K 显示输出,支持 4K 摄像头接入,双千兆网口(其中一个支持POE供电)和 4 个 USB3.0 接口,多种音频输入输出(由专用 C906 核心处理)。LicheePi 4A 是截止目前(2023Q2)为止最强的 RISC-V SBC。性能约为上一代 RISC-V SBC VisionFive2的2倍;未开启专用指令集加速的情况下,性能逼近基于 ARM A72 的树莓派 4,在开启相关指令集加速的情况下,可以与树莓派 4 持平。而且最高具备 16GB 超大内存,是树莓派 4 最高配置 8GB 内存的两倍!
基础参数#
主控参数
主控芯片
TH1520
CPU处理器
RISC-V 64GCV C910*4@1.85GHz
· 每核支持 64KB I cache 和 64KB D Cache
· 四核共享 1MB L2 Cache
· 支持 TEE 和 REE,TEE/REE 支持核数启动时可配置
· 支持自定义且接口兼容 RISC-V 的多核调试框架
· 独立电源域,支持 DVFS
图形处理器
· OpenCL 1.1/1.2/2.0
· OpenGL ES 3.0/3.1/3.2
· Vulkan 1.1/1.2
· Android NN HAL
NPU处理器
支持 4TOPS@INT8 通用 NNA 算力,主频 1GHz
· 支持 TensorFlow、ONNX、Caffe
· 支持 CNN、RNN、DNN 等
视频解码器
实时解码器,支持 H.265/H.264/VP9/8/7/6/AVS/AVS+/AVS2.0/VC1/MPEG4
· 支持 H.264 BP/MP/HP@level 5.1 解码,最大 4K 分辨率
· 支持 H.265/HEVC Main Profile@level 5.1 解码,最大 4K 分辨率
· 支持 VP9 Profile-2 解码,最大 4K 分辨率
· 支持 AVS2.0 解码,最大 4K 分辨率
· 支持 VP6/7/8/AVS/AVS+/VC1/MPEG4 解码,最大 1920x1080 分辨率
· 解码性能最大 4K@75fps
视频编码器
· 支持 H.264 BP/MP/HP@level4.2 编码,最大 4K 分辨率
· 支持 H.265/HEVC Main Profile 编码,最大 4K 分辨率
· 仅支持 I 帧和 P 帧
· 编码性能最大 4K@40fps
硬件特性
RAM
· 8GB 64bits LPDDR4X
· 16GB 64bits LPDDR4X
存储
· eMMC: 可选 空贴、 8G、 32G、 128G
· 支持 TF 卡
以太网
· 2 x 千兆以太网接口,可选 POE
USB
· USB3.0 x 4
· USB2.0 x 1(仅用于烧录)
音频接口
· 1 x 3.5mm 耳机接口
· 一个扬声器接口
· 两个板载麦克风
显示接口
· 1 x HDMI2.0
· 1 x 4-lane MIPI DSI
摄像头接口
· 2 x 2-lane MIPI CSI
· 1 x 4-lane MIPI CSI
GPIO
· UART
· IIC
· SPI
虽然硬件配置上比树莓派4优秀一些,但是软件生态上肯定是比不过的,但我相信假以时日,国产会越来越好!支持国产!
-
回复了主题帖:
【玄铁杯第三届RISC-V应用创新大赛】LicheePi 4A+003打印外壳
打印外壳多少刀
- 2023-10-29
-
发表了主题帖:
【MSPM0L1306 LaunchPad】5、串口的配置应用
开发板串口连接到了调试器的虚拟串口:
创建新工程
选择串口例程,可以看到外设例程非常丰富
例程说明,说明了使用方法和开发板跳冒的设置,非常详细
串口的配置如下
主函数,例子是需要将收发管脚短接,成功就会LED闪烁
稍微修改,测试串口发送数据
为了方便使用,需要将printf重映射到串口,关闭串口的fifo配置
重写fputc函数接口,输出到串口0
测试效果:ccs自带串口助手,十分方便
完整代码如下:
#include "ti_msp_dl_config.h"
#include <stdio.h>
int fputc(int ch, FILE *f)
{
DL_UART_Main_transmitDataBlocking(UART_0_INST,(uint8_t)ch);
return ch;
}
int main(void)
{
SYSCFG_DL_init();
/* Set LED to indicate start of transfer */
DL_GPIO_clearPins(GPIO_LEDS_PORT, GPIO_LEDS_USER_LED_1_PIN);
while (1)
{
printf("hello mspm0\n");
DL_GPIO_togglePins(GPIO_LEDS_PORT,GPIO_LEDS_USER_LED_1_PIN | GPIO_LEDS_USER_TEST_PIN);
delay_cycles(5000000);
}
}
-
发表了主题帖:
【NUCLEO-H743ZI】8、stm32cubemx创建threadx工程体验
ThreadX应该是目前最牛逼的开源RTOS之一了,开源链接:https://github.com/azure-rtos/threadx有了微软大厂的支持,发展前景比其它小众RTOS广阔,官方介绍https://learn.microsoft.com/zh-cn/azure/rtos/threadx/chapter1
STM32现在新出的芯片如U5就提供了ThreadX 内核、文件系统、图形库、USB协议栈、网络协议栈、加解密等全家桶的支持包,其它各个系列陆续支持ThreadX全家桶了,使用ThreadX全家桶相比之前开源大杂烩的方式更加方便,
在STM32CubeMX中可以一键添加ThreadX的支持。STM32适配版开源链接:https://github.com/STMicroelectronics/x-cube-azrtos-h7
STM32官方对threadx的说明:https://wiki.stmicroelectronics.cn/stm32mcu/wiki/Introduction_to_THREADX
摘自官方的介绍:
Azure RTOS ThreadX 是专门为嵌入式应用程序设计的高性能实时内核。
ThreadX 的独特功能
与其他实时内核不同,ThreadX 功能多样。通过使用强大的 CISC、RISC 和 DSP 处理器的应用程序,可以轻松地在基于小型微控制器的应用程序之间扩展。
ThreadX 可基于其基础体系结构进行扩展。 因为 ThreadX 服务是作为 C 库实现的,所以只有应用程序实际使用的那些服务被引入了运行时映像。 因此,ThreadX 的实际大小完全由应用程序决定。 对于大多数应用程序,ThreadX 的指令映像的大小在 2 KB 至 15 KB 之间。
picokernel™ 体系结构
ThreadX 服务没有像传统的微内核体系结构那样将内核函数相互层叠,而是直接将其插入核心。 由此产生了最快的上下文切换和服务呼叫性能。 我们将此非分层设计称为 picokernel 体系结构。
ANSI C 源代码
ThreadX 主要是在 ANSI C 中编写的。用户需要少量的汇编语言来定制内核,从而满足基础目标处理器的需求。 此设计使用户可以在很短的时间内(通常在几周内)将 ThreadX 移植到新的处理器系列!
高级技术
下面是 ThreadX 高级技术的亮点。
简单的 picokernel 体系结构
自动扩展(占用空间少)
确定性处理
快速实时性能
抢先式和协作式计划
灵活的线程优先级支持
动态系统对象创建
无限量的系统对象
经过优化的中断处理
抢占阈值 (Preemption-threshold™)
优先级继承
事件链接 (Event-chaining™)
快速软件计时器
运行时内存管理
运行时性能监视
运行时堆栈分析
内置系统跟踪
广泛的处理器支持
广泛的开发工具支持
字节顺序完全中性
在之前配置好的工程基础上修改,首先在第三方软件包选项卡开启ThreadX支持,只勾选内核特性:
然后就会看到ThreadX软件包了,修改ThreadX的内存池大小为10240,这是线程可以申请到的最大内存;勾选生成初始化代码,这样会创建一个默认线程:
将时钟节拍TX_TIMER_TICKS_PER_SECOND改为1000,即系统调度周期是1ms。
修改裸机的Timebase Source为TIM6,因为Systick被RTOS占用了,HAL库里面需要用到这个时钟。
生成的代码结构如下:
在app_threadx.c中添加3个测试线程:分别是控制2个LED闪烁和串口打印数据
/* USER CODE BEGIN Header */
/**
******************************************************************************
* [url=home.php?mod=space&uid=1307177]@File[/url] app_threadx.c
* [url=home.php?mod=space&uid=1315547]@author[/url] MCD Application Team
* [url=home.php?mod=space&uid=159083]@brief[/url] ThreadX applicative file
******************************************************************************
* [url=home.php?mod=space&uid=1020061]@attention[/url] *
* Copyright (c) 2020-2021 STMicroelectronics.
* All rights reserved.
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "app_threadx.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "main.h"
#include "spi.h"
#include "usart.h"
#include "gpio.h"
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
/* USER CODE END PTD */
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
/* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/
TX_THREAD tx_app_thread;
/* USER CODE BEGIN PV */
TX_THREAD tx_app_thread2;
#define APP_CFG_TASK_USER_IF_STK_SIZE 4096u
static uint64_t AppTaskStatStk[APP_CFG_TASK_USER_IF_STK_SIZE/8];
TX_THREAD tx_app_thread3;
#define APP_CFG_TASK_USER2_STK_SIZE 4096u
static uint64_t App2TaskStatStk[APP_CFG_TASK_USER2_STK_SIZE/8];
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
/* USER CODE BEGIN PFP */
/* USER CODE END PFP */
/**
* @brief Application ThreadX Initialization.
* @param memory_ptr: memory pointer
* @retval int
*/
UINT App_ThreadX_Init(VOID *memory_ptr)
{
UINT ret = TX_SUCCESS;
TX_BYTE_POOL *byte_pool = (TX_BYTE_POOL*)memory_ptr;
/* USER CODE BEGIN App_ThreadX_MEM_POOL */
/* USER CODE END App_ThreadX_MEM_POOL */
CHAR *pointer;
/* Allocate the stack for tx app thread */
if (tx_byte_allocate(byte_pool, (VOID**) &pointer,
TX_APP_STACK_SIZE, TX_NO_WAIT) != TX_SUCCESS)
{
return TX_POOL_ERROR;
}
/* Create tx app thread. */
if (tx_thread_create(&tx_app_thread, "tx app thread", tx_app_thread_entry, 0, pointer,
TX_APP_STACK_SIZE, TX_APP_THREAD_PRIO, TX_APP_THREAD_PREEMPTION_THRESHOLD,
TX_APP_THREAD_TIME_SLICE, TX_APP_THREAD_AUTO_START) != TX_SUCCESS)
{
return TX_THREAD_ERROR;
}
/* USER CODE BEGIN App_ThreadX_Init */
if (tx_thread_create(&tx_app_thread2,
"tx2 app thread",
tx_app_thread_entry2,
0,
&AppTaskStatStk[0],
APP_CFG_TASK_USER_IF_STK_SIZE,
TX_APP_THREAD_PRIO+1,
TX_APP_THREAD_PREEMPTION_THRESHOLD,
TX_APP_THREAD_TIME_SLICE,
TX_APP_THREAD_AUTO_START) != TX_SUCCESS)
{
return TX_THREAD_ERROR;
}
if (tx_thread_create(&tx_app_thread3,
"tx3 app thread",
tx_app_thread_entry3,
0,
&App2TaskStatStk[0],
APP_CFG_TASK_USER2_STK_SIZE,
TX_APP_THREAD_PRIO+1,
TX_APP_THREAD_PREEMPTION_THRESHOLD,
TX_APP_THREAD_TIME_SLICE,
TX_APP_THREAD_AUTO_START) != TX_SUCCESS)
{
return TX_THREAD_ERROR;
}
/* USER CODE END App_ThreadX_Init */
return ret;
}
/**
* @brief Function implementing the tx_app_thread_entry thread.
* @param thread_input: Hardcoded to 0.
* @retval None
*/
void tx_app_thread_entry(ULONG thread_input)
{
/* USER CODE BEGIN tx_app_thread_entry */
while(1){
HAL_GPIO_WritePin (LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET);
tx_thread_sleep(100);
HAL_GPIO_WritePin (LD2_GPIO_Port, LD2_Pin, GPIO_PIN_SET);
tx_thread_sleep(100);
}
/* USER CODE END tx_app_thread_entry */
}
/**
* @brief Function that implements the kernel's initialization.
* @param None
* @retval None
*/
void MX_ThreadX_Init(void)
{
/* USER CODE BEGIN Before_Kernel_Start */
/* USER CODE END Before_Kernel_Start */
tx_kernel_enter();
/* USER CODE BEGIN Kernel_Start_Error */
/* USER CODE END Kernel_Start_Error */
}
/* USER CODE BEGIN 1 */
void tx_app_thread_entry2(ULONG thread_input)
{
while(1)
{
HAL_GPIO_WritePin (LD3_GPIO_Port, LD3_Pin, GPIO_PIN_RESET);
tx_thread_sleep(1000);
HAL_GPIO_WritePin (LD3_GPIO_Port, LD3_Pin, GPIO_PIN_SET);
tx_thread_sleep(1000);
}
}
void tx_app_thread_entry3(ULONG thread_input)
{
float a = 0;
while(1)
{
printf("%u test a=%f\n",tx_time_get(),a);
a+=1.3;
tx_thread_sleep(1);
}
}
/* USER CODE END 1 */
效果:
[localvideo]c9859e6dc3349299b8edda6b05f3b47f[/localvideo]
工程:
-
回复了主题帖:
【DigiKey“智造万物,快乐不停”创意大赛】 物料开箱 ---SenseCAP Indicator 赏析
针不错,内置电池吗
- 2023-10-26
-
回复了主题帖:
英飞凌版图又扩展了~收购了GaN Systems,成氮化镓龙头
收购ADI,德州仪器