- 2024-08-22
-
回复了主题帖:
【颁奖】全能小网关|CH32V208: BLE5.3+ USB2.0+ 10M Ethernet+ CAN + 4*UART
已确认个人收件信息
- 2024-08-08
-
回复了主题帖:
离线地图怎么应用到单片机上呢?
持续关注一下,自己也学习学习大佬们的奇技淫巧!
- 2024-08-06
-
加入了学习《CH582 AHT 温湿度计》,观看 CH582 AHT10 温湿度计
- 2024-07-21
-
回复了主题帖:
全能小网关|CH32V208--第五篇:ETH与BLE的联动
lugl4313820 发表于 2024-7-21 09:07
蓝牙转wlan,确实是比较牛的功能了。
因为工作需要用到这个转换,也算是提前熟悉这部分功能了。
- 2024-07-20
-
发表了主题帖:
全能小网关|CH32V208--第五篇:ETH与BLE的联动
本帖最后由 xiaolinen 于 2024-7-20 19:07 编辑
一:说明
(1)本次实验是在BLE_UART例程中,添加TCP客户端和SLEEP功能下进行的;
(2)ETH和BLE共存的情况下,将系统核心时钟设置为120MHz:
既:uint32_t SystemCoreClock=SYSCLK_FREQ_120MHz_HSE;
二:设置SLEEP功能
2.1,sleep功能进入逻辑
当蓝牙接收到“AT+SLEEP=1\r\n”时,进入低功耗模式;
2.2,sleep功能使能和低功耗模式下GPIO的状态设置函数
/*********************************************************************
* @fn sleep_modem_gpio_state_func
*
* @brief sleep休眠模式时,GPIO的状态
*
* @return none
*/
void sleep_modem_gpio_state_func(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //enable clock
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //enable clock
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //enable clock
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); //enable clock
GPIO_InitTypeDef GPIO_InitStructure = {0}; //gpio init struct
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; //gpio pin
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //gpio mode
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //gpio speed
GPIO_Init(GPIOA, &GPIO_InitStructure); //gpio init
GPIO_Init(GPIOB, &GPIO_InitStructure); //gpio init
GPIO_Init(GPIOC, &GPIO_InitStructure); //gpio init
GPIO_Init(GPIOD, &GPIO_InitStructure); //gpio init
}
/*********************************************************************
* @fn sleep_mode_enable
*
* @brief 使能sleep休眠模式
*
* @return none
*/
void sleep_mode_enable(void)
{
if(((RCC->CFGR0 & RCC_SWS)==0x04)||((RCC->CFGR0 & RCC_PLLSRC) == RCC_PLLSRC))
{
RCC_HSICmd(DISABLE);
}
__WFI();
}
三:添加TCP客户端功能
3.1,添加wchnet库文件
3.1.1,工程中添加操作,如下图所示:
备注:步骤4为添加后的结果
3.1.2,“包含”添加操作,如下图所示:
3.1.3,“库”添加操作,如下图所示:
3.1.4,“库路径”添加操作,如下图所示:
3.1.5,TCP部分代码记录,如下所示:
/*********************************************************************
* @fn WCHNET_CreateTcpSocket
*
* @brief Create TCP Socket
*
* @return none
*/
static u8 socket_test;
/*********************************************************************
* @fn WCHNET_CreateTcpSocket
*
* @brief Create TCP Socket
*
* @return none
*/
void WCHNET_CreateTcpSocket(void)
{
u8 i;
SOCK_INF TmpSocketInf;
memset((void *) &TmpSocketInf, 0, sizeof(SOCK_INF));
memcpy((void *) TmpSocketInf.IPAddr, DESIP, 4);
TmpSocketInf.DesPort = desport;
TmpSocketInf.SourPort = srcport++;
TmpSocketInf.ProtoType = PROTO_TYPE_TCP;
TmpSocketInf.RecvBufLen = RECE_BUF_LEN;
i = WCHNET_SocketCreat(&SocketId, &TmpSocketInf);
printf("WCHNET_SocketCreat %d\r\n", SocketId);
mStopIfError(i);
i = WCHNET_SocketConnect(SocketId); //make a TCP connection
mStopIfError(i);
}
/*********************************************************************
* @fn WCH_TCP_CLIENT_SEND
*
* @brief TCP客户端发送数据
*
* @param void
*
* @return none
*/
uint8_t wch_tcp_client_send_func(uint8_t *buf, uint32_t *len)
{
return WCHNET_SocketSend(socket_test, buf, len);
}
/*********************************************************************
* @fn on_bleuartServiceEvt
*
* @brief ble uart service callback handler
*
* @return NULL
*/
extern void wch_tcp_client_send_func(uint8_t *buf, uint32_t *len);
void on_bleuartServiceEvt(uint16_t connection_handle, ble_uart_evt_t *p_evt)
{
switch(p_evt->type)
{
case BLE_UART_EVT_TX_NOTI_DISABLED:
PRINT("%02x:bleuart_EVT_TX_NOTI_DISABLED\r\n", connection_handle);
break;
case BLE_UART_EVT_TX_NOTI_ENABLED:
PRINT("%02x:bleuart_EVT_TX_NOTI_ENABLED\r\n", connection_handle);
break;
case BLE_UART_EVT_BLE_DATA_RECIEVED://BLE数据接收事件
PRINT("BLE RX DATA len:%d\r\n", p_evt->data.length);
PRINT("BLE RX DATA :%s\r\n", p_evt->data.p_data);
//此处,将数据发送到TCP服务器端
if(wch_tcp_client_send_func((uint8_t *)p_evt->data.p_data,(uint32_t*)&p_evt->data.length) == p_evt->data.length)
{
printf("data sent successfully!\r\n");
}
break;
default:
break;
}
}
四:实验现象
4.1,数据传输
4.1.1,TCP服务器端记录,如下:
4.1.2,设备运行日志记录,如下:
/* 上电初始化 */
CH32V20x_BLE_LIB_V1.40
SystemClk:120000000
net version:19
WCHNET_LibInit Success
WCHNET_SocketCreat 0
PHY Link Success
/* BLE连接成功 */
Initialized..
AdvertisConn 1 - Int 18
Connected..
Update 1 - Int 6
Update 1 - Int 18
Update 1 - Int 10
/* TCP第一次连接超时 */
TCP Timeout
WCHNET_SocketCreat 0
/* TCP第二次连接超时 */
TCP Timeout
WCHNET_SocketCreat 0
/* TCP连接成功 */
PHY Link Success
TCP Connect Success
socket id: 0
/* 数据转发 */
BLE RX DATA len:19
BLE RX DATA :welcome to eeworld!
data sent successfully!
BLE RX DATA len:19
BLE RX DATA :welcome to eeworld!
data sent successfully!
BLE RX DATA len:19
BLE RX DATA :welcome to eeworld!
data sent successfully!
BLE RX DATA len:19
BLE RX DATA :welcome to eeworld!
data sent successfully!
BLE RX DATA len:19
BLE RX DATA :welcome to eeworld!
data sent successfully!
BLE RX DATA len:19
BLE RX DATA :welcome to eeworld!
data sent successfully!
4.2,功耗记录
- 2024-07-07
-
回复了主题帖:
全能小网关|CH32V208--第四篇:低功耗测试
Jacktang 发表于 2024-7-7 09:24
主要是为了熟悉芯片各种低功耗模式的进入和退出方法,所记录的电流情况,并不是各个低功耗模式下的最低情况 ...
不要这么理解,不要这么理解,只是为后续进一步使用做一下铺垫
- 2024-07-06
-
发表了主题帖:
全能小网关|CH32V208--第四篇:低功耗测试
本帖最后由 xiaolinen 于 2024-7-6 22:03 编辑
一:电路图修改
将下图中的D1(LED灯)和R1电阻拆除,减少电流的耗损。
二:低功耗模式
2.1,CH32V208的低功耗模式包括:睡眠模式,停止模式,待机模式,具体如下图所示:
2.1,active模式
CH32V208在正常运行工作状态的电流情况,如下图所示:
2.3,sleep模式
2.3.1,PA0引脚输入低电平触发外部中断EXTI_Line0退出sleep睡眠模式,程序在唤醒后继续执行。
2.3.2,重点代码,如下图所示:
/*********************************************************************
* @fn EXTI0_INT_INIT
*
* @brief EXTI0中断配置,使PA0发生中断,唤醒sleep休眠
*
* @return none
*/
void EXTI0_INT_INIT(void)
{
GPIO_InitTypeDef GPIO_InitStructure = {0};
EXTI_InitTypeDef EXTI_InitStructure = {0};
NVIC_InitTypeDef NVIC_InitStructure = {0};
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* GPIOA.0 ----> EXTI_Line0 */
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
EXTI_InitStructure.EXTI_Line = EXTI_Line0;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/*********************************************************************
* @fn sleep_mode_enable
*
* @brief 使能sleep休眠模式
*
* @return none
*/
void sleep_mode_enable(void)
{
__WFI();
}
2.3.3,sleep模式下电流情况,如下图所示:
2.4,stop模式
2.4.1,PA0引脚输入低电平触发外部中断EXTI_Line0退出stop睡眠模式,程序在唤醒后继续执行。
2.4.2,重点代码,如下图所示:
/*********************************************************************
* @fn EXTI0_INT_INIT
*
* @brief EXTI0中断配置,使PA0发生中断,唤醒sleep休眠
*
* @return none
*/
void EXTI0_INT_INIT(void)
{
GPIO_InitTypeDef GPIO_InitStructure = {0};
EXTI_InitTypeDef EXTI_InitStructure = {0};
NVIC_InitTypeDef NVIC_InitStructure = {0};
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* GPIOA.0 ----> EXTI_Line0 */
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
EXTI_InitStructure.EXTI_Line = EXTI_Line0;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/*********************************************************************
* @fn stop_mode_enable
*
* @brief 使能stop休眠模式
*
* @return none
*/
void stop_mode_enable(void)
{
PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
}
2.4.3,stop模式下电流情况,如下图所示:
2.5,standby模式
2.5.1,WKUP (PA0)引脚的上升沿退出待机模式,唤醒后程序复位。
2.5.2,重点代码,如下图所示:
/*********************************************************************
* @fn gpio_init
*
* @brief GPIO初始化
*
* @return none
*/
void gpio_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure = {0};
/* To reduce power consumption, unused GPIOs need to be set as pull-down inputs */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|
RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_Init(GPIOE, &GPIO_InitStructure);
}
/*********************************************************************
* @fn PWR_WakeUpPinCmd
*
* @brief Enables or disables the WakeUp Pin functionality.
*
* @param NewState - new state of the WakeUp Pin functionality
* (ENABLE or DISABLE).
*
* @return none
*/
void PWR_WakeUpPinCmd(FunctionalState NewState)
{
if(NewState)
{
PWR->CSR |= (1 << 8);
}
else
{
PWR->CSR &= ~(1 << 8);
}
}
/*********************************************************************
* @fn PWR_EnterSTANDBYMode
*
* @brief Enters STANDBY mode.
*
* @return none
*/
void PWR_EnterSTANDBYMode(void)
{
PWR->CTLR |= PWR_CTLR_CWUF;
PWR->CTLR |= PWR_CTLR_PDDS;
NVIC->SCTLR |= (1 << 2);
__WFI();
}
2.5.3,standby模式下电流情况,如下图所示:
三:声明
本次记录的实验,主要是为了熟悉芯片各种低功耗模式的进入和退出方法,所记录的电流情况,并不是各个低功耗模式下的最低情况。
- 2024-07-03
-
回复了主题帖:
全能小网关|CH32V208--第三篇:ETH使用
lugl4313820 发表于 2024-7-3 06:55
他这个,是跑了OS吗?需要跑OS吗?
帖子里的实验过程没有跑OS的,但是这款芯片是可以跑OS的,具体怎么选择看自己的需求了。
- 2024-07-02
-
发表了主题帖:
全能小网关|CH32V208--第三篇:ETH使用
本帖最后由 xiaolinen 于 2024-7-2 20:43 编辑
一:准备工作
PC端设置以太网IP和端口,如下图所示:
二:TCP 客户端测试使用
2.1,重点代码记录
2.1.1,创建TCP客户端
void WCHNET_CreateTcpSocket(void)
{
u8 i;
SOCK_INF TmpSocketInf;
memset((void *) &TmpSocketInf, 0, sizeof(SOCK_INF));
memcpy((void *) TmpSocketInf.IPAddr, DESIP, 4);//设置目的IP
TmpSocketInf.DesPort = desport;//设置目的端口
TmpSocketInf.SourPort = srcport++;//设置源端口
TmpSocketInf.ProtoType = PROTO_TYPE_TCP;//设置协议类型
TmpSocketInf.RecvBufLen = RECE_BUF_LEN;//设置数据缓冲区长度
i = WCHNET_SocketCreat(&SocketId, &TmpSocketInf);
printf("WCHNET_SocketCreat %d\r\n", SocketId);
mStopIfError(i);
i = WCHNET_SocketConnect(SocketId);//建立TCP连接
mStopIfError(i);
}
2.1.2,套接字中断事件监控
void WCHNET_DataLoopback(u8 id)
{
u32 len, totallen;
u8 *p = MyBuf, TransCnt = 255;
len = WCHNET_SocketRecvLen(id, NULL);//query length
printf("Receive Len = %d\r\n", len);
totallen = len;
WCHNET_SocketRecv(id, MyBuf, &len);//Read the data of the receive buffer into MyBuf
printf("recv buf :\r\n%s\r\n",MyBuf);
while(1){
len = totallen;
WCHNET_SocketSend(id, p, &len);//Send the data
totallen -= len;//Subtract the sent length from the total length
p += len;//offset buffer pointer
if( !--TransCnt ) break;//Timeout exit
if(totallen) continue;//If the data is not sent, continue to send
break;//After sending, exit
}
}
void WCHNET_HandleSockInt(u8 socketid, u8 intstat)
{
u8 i;
if (intstat & SINT_STAT_RECV)//receive data
{
printf("TCP Client Recv!\r\n");
WCHNET_DataLoopback(socketid);//Data loopback
}
if (intstat & SINT_STAT_CONNECT)//connect successfully
{
#if KEEPALIVE_ENABLE
WCHNET_SocketSetKeepLive(socketid, ENABLE);
#endif
WCHNET_ModifyRecvBuf(socketid, (u32) SocketRecvBuf[socketid], RECE_BUF_LEN);
for (i = 0; i < WCHNET_MAX_SOCKET_NUM; i++) {
if (socket[i] == 0xff) {//save connected socket id
socket[i] = socketid;
break;
}
}
printf("TCP Connect Success\r\n");
printf("socket id: %d\r\n", socket[i]);
}
if (intstat & SINT_STAT_DISCONNECT)//disconnect
{
for (i = 0; i < WCHNET_MAX_SOCKET_NUM; i++) {//delete disconnected socket id
if (socket[i] == socketid) {
socket[i] = 0xff;
break;
}
}
printf("TCP Disconnect\r\n");
}
if (intstat & SINT_STAT_TIM_OUT)//timeout disconnect
{
for (i = 0; i < WCHNET_MAX_SOCKET_NUM; i++) {//delete disconnected socket id
if (socket[i] == socketid) {
socket[i] = 0xff;
break;
}
}
printf("TCP Timeout\r\n");
WCHNET_CreateTcpSocket();
}
}
2.2,实验现象:TCP客户端接收到服务器下发的数据,打印展示,并将数据原路返回至服务器,如下图所示:
三:UDP服务器测试使用
3.1,重点代码记录
3.1.1,创建UDP服务器
void WCHNET_CreateUdpSocket(void)
{
u8 i;
SOCK_INF TmpSocketInf;
memset((void *) &TmpSocketInf, 0, sizeof(SOCK_INF));
TmpSocketInf.SourPort = srcport;//设置源端口
TmpSocketInf.ProtoType = PROTO_TYPE_UDP;//设置协议类型
TmpSocketInf.RecvStartPoint = (u32) SocketRecvBuf;//设置数据缓冲区起始地址
TmpSocketInf.RecvBufLen = UDP_RECE_BUF_LEN;//设置数据缓冲区长度
TmpSocketInf.AppCallBack = WCHNET_UdpServerRecv;//绑定接受回调函数
i = WCHNET_SocketCreat(&SocketId, &TmpSocketInf);
printf("WCHNET_SocketCreat %d\r\n", SocketId);
mStopIfError(i);
}
3.1.2,数据接收回调函数
void WCHNET_UdpServerRecv(struct _SOCK_INF *socinf, u32 ipaddr, u16 port, u8 *buf, u32 len)
{
u8 ip_addr[4], i;
printf("Remote IP:");
for (i = 0; i < 4; i++) {
ip_addr[i] = ipaddr & 0xff;
printf("%d ", ip_addr[i]);
ipaddr = ipaddr >> 8;
}
printf("srcport = %d len = %d socketid = %d\r\n", port, len,
socinf->SockIndex);
printf("buf:%s\r\n",buf);
WCHNET_SocketUdpSendTo(socinf->SockIndex, buf, &len, ip_addr, port);
}
3.2,实验现象:UDP服务器监听客户端,打印展示接收到的数据,并将数据原路返回至客户端,如下图所示:
- 2024-06-25
-
回复了主题帖:
全能小网关|CH32V208--第二篇:BLE收发双向通讯
Jacktang 发表于 2024-6-25 07:32
实验是在BLE_UART例程中进行,好吧
受教了
- 2024-06-23
-
发表了主题帖:
全能小网关|CH32V208--第二篇:BLE收发双向通讯
本帖最后由 xiaolinen 于 2024-6-23 18:37 编辑
一:修改BLE名称
1.1,CH32V208的BLE名称,涉及到两个变量的修改:应将scanRspData的名称和attDeviceName的名称配置为一样,且scanRspData中的名称长度需要同步更新。
1.2,修改如下,所示:
scanRspData变量修改部分
attDeviceName变量修改部分
1.3,实验现象,如下所示:
所显示蓝牙为过滤后的结果
二:BLE接受和发送例程
2.1,声明:本次实验在BLE_UART例程中进行。
2.2,实验思路:
2.2.1,CH32V208通过BLE接收到数据,将数据转发到UART3中,进行显示。
2.2.2,CH32V208通过UART3接收到数据,通过BLE通知到手机上蓝牙助手,进行显示。
2.3,重点部分代码,如下:
2.3.1,BLE接受,转发至UART3,重点代码如下:
2.3.2,UART3接受,转发至BLE,重点代码如下:
串口中断,将接收到的数据写入app_uart_rx_fifo中
主循环检测到UART_TO_BLE_SEND_EVT事件,从app_uart_rx_fifo中读取数据
数据通过ble_uart_notify发送出去
2.4,实验现象,如下所示:
通过蓝牙助手连接CH32V208的BLE进行数据接收和发送
通过串口助手连接CH32V208的UART3进行数据接收和发送
- 2024-06-06
-
回复了主题帖:
MicroPython动手做(32)——物联网之MQTT
学习一下大佬的笔记,太牛了,尤其是动手做系列,干货满满
- 2024-06-05
-
回复了主题帖:
[兆易GD32H759I-EVAL]学习以太网例程分享之LWIP
牛,写的太详细了
-
发表了主题帖:
全能小网关|CH32V208--第一篇:搭建环境,初步入手
本帖最后由 xiaolinen 于 2024-6-5 17:27 编辑
一:说明
关于CH32V208的测试,均为自己的使用过程,因个人水平有限,有失误的地方,敬请指导。
本篇主要记录自己的开箱,以及环境安装好后的工具调试步骤。
二:烧录器部分
2.1,烧录器为WCH-LinkE,该烧录器既支持RISC-V内核的MCU烧录,又支持ARM内核的MCU烧录;
模式更改操作如下:
首先,打开MounRiver Studio软件->下载配置->目标模式;
其次,点击查询->选择“WCH-LinkRV”->应用;
备注:烧录器的更多使用方式,请移步:https://www.wch.cn/downloads/WCH-LinkUserManual_PDF.html下载。
2.2,两种模式的指示灯对比,如下(左图为烧录ARM内核MCU指示灯,右图为烧录RISC-V内核MCU指示灯):
2.3,接线方式:
开发板 -> 烧录器
CLK -> SWCLK
DIO -> SWDIO
GND -> GND
VDD -> 3V3
TXD -> RX
RXD -> TX
接线如图所示:
如果已经通过PC的USB口连接了开发板, 就不要连WCHLink VCC, 如果连了WCHLink VCC, 就不要接USB口。
三:程序部分
3.1,功能说明:
在rt-thread下,使一个LED灯连接到PA0引脚,观察引脚输出变化;并在主线程中周期打印。
3.2,主要程序展示:
/********************************** (C) COPYRIGHT *******************************
* File Name : main.c
* Author : WCH
* Version : V1.0.0
* Date : 2021/06/06
* Description : Main program body.
*********************************************************************************
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* Attention: This software (modified or not) and binary are used for
* microcontroller manufactured by Nanjing Qinheng Microelectronics.
*******************************************************************************/
#include "ch32v20x.h"
#include <rtthread.h>
#include <rthw.h>
#include "drivers/pin.h"
/* LED0 */
#define LED_PIN 10 //PA0
/* main is just one of the threads, in addition to tshell,idle
* main is just an LED blinking, the main thread is registered in rtthread_startup,
* tshell uses the serial port to receive interrupts, and the interrupt stack and thread stack are
* used separately.Note that when entering an interrupt, the 16caller register needs to be pushed
* into the thread stack
*/
int main(void)
{
SystemCoreClockUpdate();
while(1)
{
rt_kprintf("Welcome to eeworld!\r\n");
rt_thread_mdelay(1000);
}
}
/*
* @fn pro_led_blink_thread_entry
*
* @brief run thread
*
* @return none
*/
void pro_led_blink_thread_entry(void *param)
{
rt_pin_mode(LED_PIN, PIN_MODE_OUTPUT);
while(1){
rt_pin_write(LED_PIN, PIN_LOW);
rt_thread_mdelay(500);
rt_pin_write(LED_PIN, PIN_HIGH);
rt_thread_mdelay(500);
}
}
/*
* @fn pro_led_blink_func
*
* @brief create thread
*
* @return RT_EOK/RT_ERROR
*/
int pro_led_blink_func(void)
{
int ret = RT_ERROR;
static rt_thread_t blink_thread = RT_NULL;
// 动态创建线程
blink_thread = rt_thread_create("blink_thread",pro_led_blink_thread_entry,RT_NULL,1024,8,20);
if(blink_thread != RT_NULL){
rt_thread_startup(blink_thread);
ret = RT_EOK;
}else{
rt_kprintf("create blink_thread failed!\r\n");
ret = RT_ERROR;
}
return ret;
}
INIT_APP_EXPORT(pro_led_blink_func);
3.3,实验现象如下:
3.3.1,周期打印现象,如下:
3.3.2,LED灯运行现象,如下:
[localvideo]e7fe0501698ae20ad4a2b3cd6c44f493[/localvideo]
- 2024-05-28
-
加入了学习《STM32电机控制(硬石科技)》,观看 直流有刷电机(第1节)_电机概述&硬石电机实验箱
- 2024-05-27
-
回复了主题帖:
《python编程快速上手》第十篇:了解python的处理图像
13620203064 发表于 2024-5-27 18:08
linux windows下的效果一样吗?
抱歉,我的开发环境只是Windows,没试linux环境下
-
回复了主题帖:
《python编程快速上手》第十篇:了解python的处理图像
hellokitty_bean 发表于 2024-5-27 14:04
恭喜恭喜,终于要到结束部分了。。。。。看来确实受益匪浅
关键是看帖子的我,也受益匪浅呢,感谢分享 ...
一起学习,共同进步
-
回复了主题帖:
《python编程快速上手》第十篇:了解python的处理图像
秦天qintian0303 发表于 2024-5-27 08:47
学习的目的就是要用,学以致用
没毛病
- 2024-05-26
-
回复了主题帖:
《python编程快速上手》第十篇:了解python的处理图像
xinmeng_wit 发表于 2024-5-26 19:31
速度挺快的呀,都到最后了,图像处理了
先学习自己工作中可能用到的部分
-
回复了主题帖:
《python编程快速上手》第十篇:了解python的处理图像
秦天qintian0303 发表于 2024-5-26 20:57
这就基本上这个书已经学完了
是的,已经学到后半部分了,受益匪浅