-
MianQi 发表于 2021-2-25 08:37
返回一个 ‘/’ 因为你就是这样写地呀。
在shell下不能运行的命令,恐怕是格式不对,是不是应 ...
我找到问题所在了,makefile中的dir是一个函数,但shell下的dir是命令。
不是一个东西。
makefile: 文件名操作函数 dir
取目录函数——dir
解释: 从文件名序列<names>中取出目录部分。目录部分是指最后一个反斜杠(“/”)之前的部分
示例: $(dir src/foo.c hacks)返回值是“src/”。
唉,一起进步吧
-
学习学习哈
-
liu583685 发表于 2020-6-27 21:08
就是在VS2019上调试的,应该是有一些宏定义需要在工程里设置。
链接:https://pan.baidu.com/s/1maAioGy6thx-qGSZL8hIwg
提取码:wq71
这个是我的源工程,你可以看看。
代码里还有内存泄露,我在arm平台上修复了,这里的代码没有改。要注意一下。
-
redstone8415 发表于 2020-6-27 16:57
VS2019 编译不过!有几处有问题!
就是在VS2019上调试的,应该是有一些宏定义需要在工程里设置。
-
//计算二叉树,并释放结点
double cal_tree(Tnode_t* root)
{
double value;
switch (root->method)
{
case VLAUE:
value = root->value;
fx_free(root);
break;
case ADD_M:
value = cal_tree(root->Lchild) + cal_tree(root->Rchild);
fx_free(root->Lchild);
fx_free(root->Rchild);
break;
case SUB_M:
value = cal_tree(root->Lchild) - cal_tree(root->Rchild);
fx_free(root->Lchild);
fx_free(root->Rchild);
break;
case MUL_M:
value = cal_tree(root->Lchild) * cal_tree(root->Rchild);
fx_free(root->Lchild);
fx_free(root->Rchild);
break;
case DIR_M:
value = cal_tree(root->Lchild) / cal_tree(root->Rchild);
fx_free(root->Lchild);
fx_free(root->Rchild);
break;
case SIN_M:
value = sin(cal_tree(root->Lchild));
fx_free(root);
break;
case COS_M:
value = cos(cal_tree(root->Lchild));
fx_free(root);
break;
case TAN_M:
value = tan(cal_tree(root->Lchild));
fx_free(root);
break;
default:
return 0;
}
return value;
}
修复一个Bug, 内存泄漏
-
怎么看不到啊
-
zhangdaijinqf 发表于 2017-5-11 11:54
摩拜要是能远程关锁就好了
有这个用户需求吗?
-
michael_llh 发表于 2016-10-20 11:47
你是想说云端部分自己做是吗
就是自己写
-
ylyfxzsx 发表于 2016-9-26 00:55
你是要这种吗?https://bbs.eeworld.com.cn/thread-439726-1-1.html
我要的不是这个,这个好像是从外网访问的单片机唉。
也就是服务器就是单片机哦
-
汤权 发表于 2016-9-25 22:02
你想怎么弄,我也在弄物联网,也写了个服务器,也是用STM32主控的,好巧,缘分啊
你有没有相关的资料啊?我这边就是资料欠缺的太多了。
可能咱俩弄的项目差不太多。信息共享吧,留个qq好联系,亲。哈哈
-
kk118a 发表于 2016-9-25 21:37
网络终端,路由器,一台服务器电脑,组成就好了
对,大概就是这么个思路。但是具体的话,我也没有做过也没有这方面的资料。
您要是有资料能不能推荐我
-
51是一类芯片啊,有强大的呢。
-
硬件缺陷没办法喽
-
kangkls 发表于 2016-8-22 07:25
这个论坛找下两只老虎的程序,四个按键都可以用。
就是stm32的某些管脚它的最基本功能不是GPIO
比如说我遇到的这个问题就是 PB3 是JTAG的JTDO脚。
这个脚的推挽输出功能就等于复用了
然后要开复用时钟,然后再配置
这样就对了。
0.0
-
问题出在了管脚复用这边了,
就是stm32的某些管脚它的最基本功能不是GPIO
比如说我遇到的这个问题就是 PB3 是JTAG的JTDO脚。
这个脚的推挽输出功能就等于复用了
然后要开复用时钟,然后再配置
这样就对了。
额。
当我不知道时这个问题难了我好久,但当我知道了的时候才发现这个这么简单我都不知道。
加油吧,青年。
-
很简单的一个键盘扫描程序,但是其中上,下,左都是好的,能用。同样的配置我右却不能用。这个问题我不知道是软件问题还是硬件问题了,但是硬件我检查了,没有问题的呀。
-
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "touch.h"
#include "led.h"
int main(void)
{
vu8 data;
delay_init();
uart_init(115200);
LED_Init();
printf("led初始化完成\n");
KEY_Init();
printf("key初始化完成\n");
// LED_THREE();
PAout(3)=0;
delay_ms(20000);
while(1)
{
//printf("key初始化完成\n");
//delay_ms(1000);
data=KEY_Scan(0);
if(data)
{
switch(data)
{
case 1 :
PAout(0)=!PAout(0);
printf("左键状态置反\r\n");
break;
case 2 :
PAout(1)=!PAout(1);
printf("下键状态置反\r\n");
break;
case 3 :
PAout(2)=!PAout(2);
printf("rigt状态置反\r\n");
break;
case 4 :
PAout(3)=!PAout(3);
printf("上键状态置反\r\n");
break;
}
}else ; //printf("没有按键按下\n");;
}
}
-
#include "touch.h"
#include "sys.h"
#include "delay.h"
#include "usart.h"
#define KEY_left GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5)
#define KEY_down GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_4)
#define KEY_right GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_3)
#define KEY_up GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_4)
void KEY_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0设置成输入,默认下拉
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0设置成输入,默认下拉
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
u8 KEY_Scan(u8 mode)
{
static u8 key_up=1;//按键按松开标志
if(mode)key_up=1; //支持连按
if(key_up&&(KEY_left==1||KEY_down==1||KEY_right==1||KEY_up==1))
{
delay_ms(10);
key_up=0;
if(KEY_left==1)return 1; // G
else if(KEY_down==1)return 2; // R
else if(KEY_right==1)
{
printf("下键状态置反\r\n");
return 3; // LED3 这里没有返回值,估计也就是KEY_right没有扫描到高电平
}
else if(KEY_up==1)return 4; // B
}
else if(KEY_left==0&&KEY_down==0&&KEY_right==0&&KEY_up==0)key_up=1;
return 0;
}
-
串口调试之谜————重见天日
(我可爱的ufun串口终于是通了)
曾几何时,我被小小的串口挡住去路。如今我在各网友的帮助下现在是调通了。
串口的乱码经验
1.检查双方的通信配置
波特率,停止位,数据位,奇偶校验,这些最基本的设置。
2.检查时钟是否有问题
1).stm32f103系列的系统时钟是否有误。
官方的库默认的是8M的外部晶振,看看你的板子上是多少。比如我的ufun上是12M 的
对程序修改如下
找到stm32f10x.h这个头文件,其中有这样的代码
#if !defined HSE_VALUE
#ifdef STM32F10X_CL
#define HSE_VALUE ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */
#else
#define HSE_VALUE ((uint32_t)12000000) /*!< Value of the External oscillator in Hz */
#endif /* STM32F10X_CL */
#endif /* HSE_VALUE */
#if !defined HSE_VALUE
#ifdef STM32F10X_CL
#define HSE_VALUE ((uint32_t)12000000) /*!< Value of the External oscillator in Hz */
#else
#define HSE_VALUE ((uint32_t)12000000) /*!< Value of the External oscillator in Hz */
#endif /* STM32F10X_CL */
#endif /* HSE_VALUE */
大家注意这里的STM32F10X_CL这个是在配置工程时在 Target 的C/C++选项的Define 这里定义的
全局变量,根据你所使用的单片机查看这两个标示符是否一致,不一致的话就把上面的代码中的
改成你自己的。然后大家接着来改代码中的 1200 0000这个数值,改成与你板子相同的晶振值x100 0000
这样系统就知道你的外部时钟是用的多少M了。
接着还要去看看startup_stm32F10x_hd.s启动文件中的大概1030——1056行的代码,这是设置时钟树中的
PLL倍频器的系数,具体原理这里不赘述了。有兴趣去看看stm32的时钟树构成,加深理解。
尽量不要超频 也就是说这里的系数和你的晶振的乘积不能大于72M。
结束语:
一个串口让我认真的学习了stm32的系统时钟,在网友的帮助下解决了我的问题。
要相信每一个疑问后面都是有答案的,当你搜集信息足够多的时候,疑问自然消除。
-
你好,谢谢