- 2025-04-16
-
回复了主题帖:
航芯ACM32F403怎么进行调试啊
板载的不是jlink啊,你怎么接了调试的??
- 2025-04-15
-
回复了主题帖:
【航芯ACM32F403开发板测评】+ i2c外设接口传感器测试
Jacktang 发表于 2025-4-15 07:45
这I2C接口设备通过串口shell来测试还行
自己用挺方便的
- 2025-04-13
-
发表了主题帖:
【航芯ACM32F403开发板测评】+ i2c外设接口传感器测试
本帖最后由 流水源 于 2025-4-13 22:36 编辑
本次来试试I2C接口设备。利用手上的I2C传感器模块测试一下。实物如下,使用arduino插座。
板上有2个I2C接口传感器:一个温湿度SHTC3,一个光照接近传感器RPR-0521RS。使用I2C管教为PB8和PB9.
首先初始化I2C接口:
I2C_HandleTypeDef hi2c1;
/*******************************************************************************
* Function Name : I2C_GPIO_Init
* Description : Initializes the IIC peripheral.
* Input : None
* Return : None
*******************************************************************************/
void drv_i2c_gpio_init( void )
{
#ifdef I2C_USE_GPIO
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOB_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(I2C_SCL_PORT, I2C_SCL_PIN, GPIO_PIN_SET);
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(I2C_SDA_PORT, I2C_SDA_PIN, GPIO_PIN_SET);
/*Configure GPIO pins : BEEP_Pin SPI_CS_Pin */
GPIO_InitStruct.Pin = I2C_SCL_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(I2C_SCL_PORT, &GPIO_InitStruct);
GPIO_InitStruct.Pin = I2C_SDA_PIN;
HAL_GPIO_Init(I2C_SDA_PORT, &GPIO_InitStruct);
#else
hi2c1.Instance = I2C1;
hi2c1.Init.I2C_Mode = I2C_MODE_MASTER;
hi2c1.Init.Tx_Auto_En = TX_AUTO_EN_ENABLE;
hi2c1.Init.Clock_Speed = CLOCK_SPEED_FAST;
hi2c1.Init.No_Stretch_Mode = NO_STRETCH_MODE_NOSTRETCH;
HAL_I2C_Init(&hi2c1);
#endif
}
/************************************************************************
* function : HAL_I2C_MspInit
* Description:
* input : hi2c : pointer to a I2C_HandleTypeDef structure that contains
* the configuration information for I2C module
************************************************************************/
void HAL_I2C_MspInit(I2C_HandleTypeDef *hi2c)
{
/*
NOTE : This function should be modified by the user.
*/
/* For Example */
GPIO_InitTypeDef GPIO_Handle;
/* I2C1 */
if (hi2c->Instance == I2C1)
{
/* Enable Clock */
System_Module_Reset(RST_I2C1);
System_Module_Enable(EN_I2C1);
System_Module_Enable(EN_GPIOAB);
/* I2C1 SDA PortB Pin7 */
/* I2C1 SCL PortB Pin6 */
GPIO_Handle.Pin = GPIO_PIN_8 | GPIO_PIN_9;
GPIO_Handle.Mode = GPIO_MODE_AF_OD;
GPIO_Handle.Pull = GPIO_PULLUP;
GPIO_Handle.Alternate = GPIO_FUNCTION_6;
HAL_GPIO_Init(GPIOB, &GPIO_Handle);
/* Clear Pending Interrupt */
NVIC_ClearPendingIRQ(I2C1_IRQn);
/* Enable External Interrupt */
NVIC_EnableIRQ(I2C1_IRQn);
}
/* I2C2 */
else if (hi2c->Instance == I2C2)
{
System_Module_Reset(RST_I2C2);
System_Module_Enable(EN_I2C2);
System_Module_Enable(EN_GPIOAB);
/* I2C2 SDA PortB Pin14 */
/* I2C2 SCL PortB Pin13 */
GPIO_Handle.Pin = GPIO_PIN_13 | GPIO_PIN_14;
GPIO_Handle.Mode = GPIO_MODE_AF_OD;
GPIO_Handle.Pull = GPIO_PULLUP;
GPIO_Handle.Alternate = GPIO_FUNCTION_6;
HAL_GPIO_Init(GPIOB, &GPIO_Handle);
/* Clear Pending Interrupt */
NVIC_ClearPendingIRQ(I2C2_IRQn);
/* Enable External Interrupt */
NVIC_EnableIRQ(I2C2_IRQn);
}
}
/************************************************************************
* function : HAL_I2C_MspDeInit
* Description:
* input : hi2c : pointer to a I2C_HandleTypeDef structure that contains
* the configuration information for I2C module
************************************************************************/
void HAL_I2C_MspDeInit(I2C_HandleTypeDef *hi2c)
{
/*
NOTE : This function should be modified by the user.
*/
/* For Example */
/* I2C1 */
if (hi2c->Instance == I2C1)
{
/* Disable Clock */
System_Module_Disable(EN_I2C1);
/* I2C1 SDA PortB Pin7 */
/* I2C1 SCL PortB Pin6 */
HAL_GPIO_DeInit(GPIOB, GPIO_PIN_8 | GPIO_PIN_9);
/* Clear Pending Interrupt */
NVIC_ClearPendingIRQ(I2C1_IRQn);
/* Disable External Interrupt */
NVIC_DisableIRQ(I2C1_IRQn);
}
/* I2C2 */
else if (hi2c->Instance == I2C2)
{
/* Disable Clock */
System_Module_Disable(EN_I2C2);
/* I2C2 SDA PortB Pin14 */
/* I2C2 SCL PortB Pin14 */
HAL_GPIO_DeInit(GPIOB, GPIO_PIN_13 | GPIO_PIN_14);
/* Clear Pending Interrupt */
NVIC_ClearPendingIRQ(I2C2_IRQn);
/* Disable External Interrupt */
NVIC_DisableIRQ(I2C2_IRQn);
}
}
添加I2C读写API.
我添加了串口SHELL来控制I2C接口的设备检测和寄存器读写。
再就是工程中添加传感器的驱动。
编译后烧写。然后通过串口shell来测试一下:
- 2025-04-09
-
回复了主题帖:
【航芯ACM32F403开发板测评】+nr_micro_shell移植
lugl4313820 发表于 2025-4-9 07:10
这个shell工具还是非常好用的,大家都可以移植用一下。
相当不错
- 2025-04-08
-
回复了主题帖:
【航芯ACM32F403开发板测评】+nr_micro_shell移植
jobszheng5 发表于 2025-4-8 09:58
这种shell在项目应用里面方便吗?
可以啊,方便代码测试和调试控制
-
回复了主题帖:
【航芯ACM32F403开发板测评】+新建工程点灯
lugl4313820 发表于 2025-4-8 09:03
点好灯,成功了90%,剩下10%准备用来做什么?
继续盘它,各个外设都试试
- 2025-04-07
-
发表了主题帖:
【航芯ACM32F403开发板测评】+nr_micro_shell移植
本次来实现nr_micro_shell这个小巧的shell移植。
首先实现串口中断发送接收:
typedef struct fifo_buffer_t
{
volatile uint32_t read_i;
volatile uint32_t write_i;
uint8_t buff[512];
}fifo_buffer_t;
typedef struct shell_uart_buffer_t
{
fifo_buffer_t tx;
fifo_buffer_t rx;
volatile uint32_t tx_cpl : 1;
}shell_uart_buffer_t;
extern shell_uart_buffer_t g_shell_uart;
static uint8_t uart_recv_buff[4];
static uint8_t uart_send_buff[128];
shell_uart_buffer_t g_shell_uart=
{
.tx.read_i = 0,
.tx.write_i = 0,
.rx.read_i = 0,
.rx.write_i = 0,
.tx_cpl = 0,
};
//
static void uart_get_data_send(void)
{
uint32_t i;
//
for(i=0;i<128;i++)
{
if(g_shell_uart.tx.read_i != g_shell_uart.tx.write_i)
{
uart_send_buff[i] = g_shell_uart.tx.buff[g_shell_uart.tx.read_i++];
g_shell_uart.tx.read_i &= 0x1ff; //256Byte
}else break;
}
if(i)
{
g_shell_uart.tx_cpl = 1;
HAL_UART_Transmit_IT(&UART2_Handle,uart_send_buff,i, UART_TX_FIFO_1_2);
}
}
static void uart_send_char(uint8_t ch)
{
while(((g_shell_uart.tx.write_i+1)&0x1ff) == g_shell_uart.tx.read_i)
{
//fifo buffer full
if((g_shell_uart.tx_cpl == 0))
{
uart_get_data_send();
}
}
g_shell_uart.tx.buff[g_shell_uart.tx.write_i++] = ch;
g_shell_uart.tx.write_i &= 0x1ff;//256Byte
if((g_shell_uart.tx_cpl == 0))
{
uart_get_data_send();
}
}
//////////////////////////////////////////////////////////////////////////////
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == UART2) //shell
{
//
if(((g_shell_uart.rx.write_i+1)&0x1ff) != g_shell_uart.rx.read_i)
{
g_shell_uart.rx.buff[g_shell_uart.rx.write_i++] = uart_recv_buff[0] & 0xff;
g_shell_uart.rx.write_i &= 0x1ff;//256Byte
}
HAL_UART_Receive_IT(huart,uart_recv_buff,1, UART_RX_FIFO_1_16);//
}
}
//
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == UART2) //shell
{
g_shell_uart.tx_cpl = 0;
uart_get_data_send();
}
}
//
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == UART2) //shell
{
HAL_UART_Receive_IT(huart,uart_recv_buff,1, UART_RX_FIFO_1_16);//
}
}
int stdout_putchar (int ch)
{
uart_send_char(ch & 0xff);
return ch;
}
int fputc(int ch,FILE *f)
{
return stdout_putchar(ch);
}
void USART_PutChar(uint8_t ch)
{
stdout_putchar(ch);
}
uint8_t USART_GetChar(void)
{
uint8_t ch;
while(g_shell_uart.rx.read_i == g_shell_uart.rx.write_i);
ch = g_shell_uart.rx.buff[g_shell_uart.rx.read_i++];
g_shell_uart.rx.read_i &= 0x1ff; //256Byte
return ch;
}
然后是添加nr_micro_shell代码,配置串口的发送数据。
添加头文件路径支持。
初始化shell,读取串口接收的数据解析命令。
void shell_usart_init(void)
{
#ifdef UART_SHELL
#if UART_SHELL == 1
userShellInit(); //LETTER_SHELL
#elif UART_SHELL == 2
shell_init(); //NR_MICRO_SHELL
#endif
#endif
HAL_UART_Receive_IT(&UART2_Handle,uart_recv_buff,1, UART_RX_FIFO_1_16);//
}
void shell_usart_loop(void)
{
//
if(g_shell_uart.rx.read_i != g_shell_uart.rx.write_i)
{
#ifdef UART_SHELL
#if UART_SHELL == 1
shellHandler(&shell, g_shell_uart.rx.buff[g_shell_uart.rx.read_i]); //letter shell
#elif UART_SHELL == 2
shell(g_shell_uart.rx.buff[g_shell_uart.rx.read_i]);
#else
USART_PutChar(g_shell_uart.rx.buff[g_shell_uart.rx.read_i]);
#endif
#endif
g_shell_uart.rx.read_i++;
g_shell_uart.rx.read_i &= 0x1ff; //256Byte
}
if(g_shell_uart.tx_cpl == 0)
{
uart_get_data_send();
}
}
主函数main中调用初始化和主循环处理接收数据。
最终编译下载之后就可以实现shell控制了。
代码工程:
- 2025-04-05
-
发表了主题帖:
【航芯ACM32F403开发板测评】+CoreMark跑分测试
之前跑通了GPIO点灯和串口打印printf。下面试试MCU的Coremark跑分。
在之前的例子基础上加上CoreMark跑分代码。
修改运行次数:
调用跑分函数。
修改优化等级位-Omax。
编译下载之后就可以在串口看到跑分结果了。
可以看到跑分结果为474左右。
-
发表了主题帖:
【航芯ACM32F403开发板测评】+新建工程点灯
ACM32F403芯片内核支持 Cortex-M33 和 Cortex-M4F 指令集。芯片内核支持一整套DSP指令用于数字信号处理,支持单精度FPU处理浮点数据,同时还支持Memory Protection Unit(MPU)用于提升应用的安全性。ACM32F403系列芯片最高工作频率可达 180MHz,内嵌数学硬件加速,内置最大 512KB 的 eFlash、最大 192KB SRAM、2MB SPI-NorFlash(选配)、8MB SPI-PSRAM(选配)。芯片集成了一个 12 位多通道 2M sps高精度 ADC、一个 12 位 2 通道的 DAC、多达 3 路运放、2 路比较器,集成了 1 个高级定时器,6 个通用 16位定时器,1 个通用 32 位定时器,2 个基本 16 位定时器,1 个系统看门狗,1 个独立看门狗,一个低功耗的实时钟(RTC),内置多路 UART、LPUART、SPI、I2C、I2S、CAN、全速 USB 等丰富的通讯外设,内建 AES、CRC、TRNG 等算法模块。
下面来体验一下这款MCU。
首先是下载相关资料。
接着安装keil pack包用于开发。
安装完成后咱们先新建工程。选择MCU型号。
复制开发包的SDK库和工程模板文件到新建工程。
将库文件和用户代码模板添加到新建的工程中。
修改keil配置。打开Options for target配置一下。
配置优化等级和头文件路径。
配置下载调试器。
编译下载之后就可以看到串口输出了。
工程代码:
- 2025-03-24
-
回复了主题帖:
测评入围名单:航芯高性能MCU系列ACM32F403开发板
个人信息无误,确认可以完成测评计划。
- 2025-03-02
-
发表了主题帖:
《Python编程:从入门到实践》+ 学习python编写类class
继续学习python的类编写。在面向对象编程中,类是经常要用的。类就是一种抽象的数据类型,代表某种实体的抽象概念,描述了所有该类的对象共享的属性和行为,对象是类的实例化。
在类中的函数,我们称为方法。
类中有个特殊的方法叫 __init__()。这个方法每当类创建实例的时候就会自动执行。类中的方法至少要有个形参self,表示类自己引用。
下面实际操作一下,创建一个类,并使用类和实例方法。
首先就是导入模块后创建类实例。需要使用模块名点(.)类名来实现,否则不成功。如上例子是dd = animal.Dog()。
其次是类里面的方法至少需要一个参数。参数名称随意,但一般使用self表示类自身引用。
再就是在模块内部可以直接用类名来创建实例并使用。
如果是利用from 模块 import 类名。这样就可以直接使用类名来初始化实例了。
接下来就是类的继承学习:
在编写类时,如果要编写的类是一个已有的类的特殊类,可以使用继承该类。当新类继承父类时,自动获得父类的所有属性和方法。新类即子类也可以定义自己独有的属性和方法,也可以重写父类的方法。
子类的__init__()方法一般要调用父类的__init__()方法,用来初始化父类中定义的属性,方便子类应用。调用父类方法使用super()函数。
下面实际操作一下:
当继承的子类什么都没有时,调用都是父类的方法。__init__()方法也可以省略。
子类新写的方法调用,以及属性初始化。
重写父类方法,调用时执行新重写的方法。
对于继承多个类时,继承的类名用逗号隔开。
class 子类(父类1,父类2,父类3)
本次python类学习了如何编写类和类的方法,使用类的属性。如何创建类的实例。如何继承类等等。
- 2025-03-01
-
发表了主题帖:
《Python编程:从入门到实践》+学习python编写函数
今天继续学习python的函数编写和类编写。
python中函数就是带名字的代码块,用于执行完成特定任务。接下来就学习如何编写函数,并将函数存储为模块。
首先定义函数,定义函数用关键字def来标识。名称后面要冒号,后面要缩进构成函数实际代码块。格式如下:
def 函数名称(多个函数参数 ):
函数体
return 返回值
1,函数可以有很多参数,也可以省略参数。函数还有返回值 return,也可以省略返回值。
2,函数传递参数时一般要和形参顺序一致。如果使用关键字实参就不用按照形参顺序。
3,函数参数还可以指定默认值。这样在省略传递参数时也不会出错。
4,函数传递啊任意数量的参数。有时候不知道函数需要多少个参数时,就可以使用一个带星号的参数。这个参数会将所有传递进来的实参创建成一个元组数据。
5,函数还可以接收传递关键字实参。通过带2个星号的参数,函数允许传递任意数量的键值对。python会将参数创建成一个字典,该字典包含函数接收到的所有键值对。
6,函数作为模块导入到另外的文件中调用。通过import关键字。
导入模块
格式是: import 模块文件名称
也可以导入模块中的特定函数,可以1个或多个函数。
格式是 : from 模块文件名称 import 模块内函数1,函数2,函数3
使用关键字as 给导入的模块或者函数指定一个另外的名称。
模块改名格式是:import 模块文件名称 as 新名称
函数改名格式是: from 模块文件名称 import 模块内函数1 as 新名称
使用星号(*)运算符表示导入模块中所有函数。
格式是: from 模块文件名称 import *
- 2025-02-24
-
回复了主题帖:
【AT-START-A403A 车规MCU开发板测评】硬件spi驱动TFT
不错,学习学习
- 2025-02-23
-
发表了主题帖:
《Python编程:从入门到实践》+学习python列表和字典操作
今天继续学习 列表的遍历读取和切片读取控制。
遍历列表的所有元素,并对每个元素执行相同的操作。首先想到的就是循环取出列表元素数据。书上这里使用for循环结构来控制。
下面实际操作一下。首先新建一个包含多个名称的列表,然后逐一取出列表的名称操作。
这里将列表内的名称进行大写操作并打印。在python中代码错误可以根据提示进行修改。
上面列表都是字符串,下面试试数值列表操作:
列表内元素也可以时混合的字符串和数值。可以用type函数获取元素类型。
下面学习如何用range函数创建数值列表。range函数最多有3个参数。
range(终止值) 表示从0开始值,+1到达终止值之前一个。
range(起始值,终止值)表示从起始值开始,+1到达终止值之前一个。
range(起始值,终止值,步进值)表示从起始值开始,+步进值 到达终止值之前一个。
下面来实测一下:
可以看到range只能+1,或者+步进值到达终止值前一个
range(10)为0-9范围
range函数2个参数时。
range函数3个参数时。可以看到步进值可为正数或负数。当+步进值无法达到终止值时,列表为空。
min(),max(),sum()这3个函数可以获取列表数值中最小值,最大值,总和值。
列表的切片处理。列表的切片相当于从原列表中获取一部分元素,重新组合成新的列表。通过指定列表的第一个元素索引和最后一个元素索引来创建列表切片。
使用方法如下,2个索引之间要用冒号隔开。
列表[起始索引 :终止索引] 2个索引可以省略一个,或者都省略。冒号不能省略。
省略起始索引表示从索引0开始。
省略终止索引表示到最后一个元素结束,包含最后一个元素。
2个索引都省略表示切片整个列表元素。相当于复制一份新的列表。
下面学习python中的元组数据结构类型。元组和列表类似。
他们区别是元组不能修改元组内部元素数据,只能修改 元组变量数据。而列表可以通过索引来修改列表内数据。
元组使用小括号对()来表示。列表使用中括号对[]来表示。
元组因为使用小括号,当内数据元素只有一个时必须后面要加个逗号,与函数参数区分。而列表不用。
最后学习一下python中的字典数据类型。
字典数据是由一系列的键值对组成的集合,使用大括号{}来表示。键值之间互相关联,可以通过键来索引对应的值数据。
下面实际操作一下字典的创建,访问,添加,修改,删除等操作。
通过键索引访问字典时,无效的键索引会出错。
通过键索引直接赋值时,如果键索引存在就是修改键对应值,如果键索引不存在就是添加键值对。
d [key] = value
删除字典键值对方法如下:
del d[key] 根据键索引删除键值对。
d.pop(key) 根据键索引删除键值对,并且返回键索引对应的值。这个可以用于取出字典内的数值进行其他处理。
上面我们看到字典通过键索引获取对应值时,如果没有对应的键索引就会出错。下面通过get方法获取字典通过键索引获取对应值时就不会出错了。
get()方法的第一个参数用于指定键索引,是必须要的;第二个参数是当指定的键索引不存在时要返回的值,是可选的。第二参数不指定时,如果键索引不存在将返回值None。
下面实操一下:
字典常用方法:
d.items() 返回所有键值对的元组视图
d.keys() / d.values() 返回所有键 / 值的列表视图
len(d) 返回字典内键值对的个数
通过上面方法就很容易遍历字典内的所有键值对,或者所有键索引,或者所有对应值。
最后就是列表,元组,以及字典之间可以相互嵌套。
就是说列表内的元素可以时字典变量,也可以时列表变量,还可以时元组变量。
字典也是,键对应的值可以是列表变量,也可以是字典变量。
到目前为止学习了基本所有python的数据变量结构了。
- 2025-02-20
-
回复了主题帖:
《Python编程:从入门到实践》+ 学习python列表操作
Jacktang 发表于 2025-2-20 07:34
还画了红圈圈解释的很清楚,谢谢楼主用心
哈哈哈,感谢支持,照着书学习。
- 2025-02-19
-
发表了主题帖:
《Python编程:从入门到实践》+ 学习python列表操作
趁着晚上有空继续学习python。本次就学习一下python的列表操作方法。
python的列表时有一系列按特定顺序排列的元素组成,这里的元素包含各种数据类型。在python中用方括号([])表示列表,用逗号分隔列表内的各个元素。
例如下面这个简单的列表:
names = [ 'zhao', 'qian','sun','li','zhou'] #这就是一个字符串元素列表。
下面我们实际在python中输入看看。
下面如何访问列表中的某个元素呢?这里我们通过列表名称加索引来表示列表中的某个元素。这像C语言中的数组差不多,通过下标来索引数据。下标也是从0开始。
当下标超出列表内元素个数时会发生错误。
还有个特殊索引就是负号下标。负号下标表示从最后开始索引。-1表示最后一个,-2表示倒数第二个,以此类推。
例如:
下面接着学习如何在列表中添加元素,修改元素,删除元素。
首先修改元素,与访问列表元素语法类似。通过指定列表名和要修改的元素索引,再指定该索引的位置上的新元素值。
例如:
接着学习如何添加元素:
添加元素到列表的末尾用append方法。
例如:
再就是在列表任意位置添加元素。这里使用insert方法。
例如:可以看到insert添加了元素。
最后时列表删除元素,列表删除元素有几种方法。
首先使用 del 语句删除,del能删除列表内任意元素,只要知道元素的索引即可。
再就是使用列表的pop方法可以删除元素。有时候你要将元素从列表删除,并接着使用它的值。就可以用pop()方法。
pop()不带参数就是删除列表最后一个元素,带索引参数表示删除列表指定索引的元素。
例子如下:
最后还有个删除元素方法,使用列表remove()方法。remove方法可以删除列表内指定的值元素。
需要注意remove方法只删除第一个指定的值,如果列表中有多个相同的指定值,就需要循环删除。
最后再学习列表内元素排序sort(),元素反向输出reverse(),len()方法获取列表长度。
本次就是简单学习一下python的列表使用方法。
- 2025-02-15
-
发表了主题帖:
《Python编程:从入门到实践》+初读体验python编程
感谢eeworld,终于成功申请了这本《Python编程:从入门到实践》关于python的学习编程的书。python目前可用在很多应用方向,像游戏,web应用,AI应用等等。我对python非常感兴趣,后面会照着书好好练习一下。
下面就是收到的书了。
书挺厚的,总共有四百多页。简单翻看了一下本书前面一部分,觉得挺不错的,非常适合初学者入门。
书的前面几章主要讲python的环境建立安装,以及python的变量和基础数据类型,以及编程流程的条件控制和循环控制。这些和学过的C语言类似。
学习前面这部分,可以熟悉python的基本编程概念,这是学习任何编程语言都需要的学习的概念,是编程的基础,是入门必须掌握的知识。
第一章起步是安装python编程环境。首先到python官网下载python安装软件。
我之前已经安装了python3.11版本了。这里就不详细说如何安装。安装过程很简单。
下面打开python终端简单试一下python编程,打印hello world。
python 的变量命名和使用方法:
变量只能字母,数字和下划线,且不能数字开头。这和C语言是一样的。再就是变量不能是python的关键字和函数名。
简单体验一下python编程。
- 2025-02-12
-
回复了主题帖:
有没有什么好方法实现ESP32C3串口扩展
直接搞个新MCU做个串口交换机,直接插上组网
- 2025-02-08
-
回复了主题帖:
读书入围名单:《Python编程:从入门到实践(第3版)》
个人信息无误,确认可以完成阅读分享计划
- 2025-01-21
-
回复了主题帖:
【回顾2024,展望2025】新年抢楼活动来啦!
⑸立一个新年Flag 学会AI识别