csz9981

    1. huo_hu 发表于 2019-4-23 13:58 是这个意思,读DR就是接收到的数据,里面有些逻辑动作.
      好的,感谢。
    2. huo_hu 发表于 2019-4-23 00:52 写入dr的内容就直接进发送缓冲区了,不能再读
      可以这么理解吗 1、送入DR,2、自动推入TDR,3、再读DR时已经为空了,所以每次读DR都是空。
    3. ienglgge 发表于 2019-4-22 13:38 中断服务函数名必须与启动文件中预设的中断服务函数名一样.不一样,系统将不能调用你写的函数。他只会寻找 ...
      感谢,学习了。
    4. huwq 发表于 2019-4-22 13:49 中断服务函数名必须与启动文件中预设的中断服务函数名一样. void EXTI9_5_IRQHandler(void) {    ...
      感谢,学习了。
    5. ienglgge 发表于 2019-4-9 17:55 定义IS_RCC_APB2_PERIPH    ((((PERIPH) & 0xFFC00002) == 0x00) && ((PERIPH) != 0x00))  这是关于PERIPH  ...
      感谢。
    6. huo_hu 发表于 2019-4-9 18:29 PERIPH就若干的位,具体哪个位对应哪个rcc时钟另外还有定义,PERIPH叫宏参数 至于 0xFFC00002是怎么来的要对 ...
      感谢。
    7. csz9981 发表于 2019-4-7 21:59 另外请教: ISIS Release 8.08.01 (Build 27031) (C) Labcenter Electronics 1990- 2018. Compiling de ...
      这个不是错误,警告:由于计算机负载过重,仿真无法按照实时的速度运行。不过其实是按实际速度的比例进行的,效果上没有问题。 如果想按实际速度运行,在计算机不升级的前提下,可以关闭一些示波器、调试界面等,速度会快点。 因为你要仿真的是ARM,需要实现的功能比普通51更多的多,所以proteus会很耗资源的。
    8. lcofjp 发表于 2019-4-7 21:49 提示你没使能相应时钟就去操作对应的外设了
      另外请教: ISIS Release 8.08.01 (Build 27031) (C) Labcenter Electronics 1990- 2018. Compiling design 'E:\STM32 lianxi\12-LED\stm32f103test\stm32f103test.pdsprj'. Netlist compilation completed OK. Netlist linking completed OK. Partition analysis completed OK. Simulating partition [63C862C5] PROSPICE 8.07.02 (Build 25463) (C) Labcenter Electronics 1993-2018. Loaded netlist 'C:\Users\ADMINI~1\AppData\Local\Temp\LISA5070.SDF' for design 'stm32f103test.pdsprj' Loading HEX file '..\Project\Objects\10 155555.hex'. [U1_CM3CORE] Read total of 1152 bytes from file '..\Project\Objects\10 155555.hex'. [U1_CM3CORE] Simulation is not running in real time due to excessive CPU load. 这个警告是什么原因?应当怎样解决?
    9. lcofjp 发表于 2019-4-7 21:49 提示你没使能相应时钟就去操作对应的外设了
      感谢你,原因找到了。
    10. 原因找到了: 错误程序: #include "bsp_led.h" void LED_GPIO_Config(void)                                                                                        //LED_用到的GPIO0配置函数, { GPIO_InitTypeDef                 GPIO_InitStruct;                                                        //按照GPIO_InitTypeDef这种结构体(表格)的格式,定义了一个新的结构体,名字叫GPIO_InitStruct         GPIO_InitStruct.GPIO_Pin     =     LED_G_GPIO_PIN;                                        //把具体的参数输入到表格中, GPIO_InitStruct.GPIO_Mode    =     GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Speed   =     GPIO_Speed_50MHz; GPIO_Init(LED_G_GPIO_PORT, &GPIO_InitStruct);                                                //利用初始化函数,把初始化GPIO需要用到的参数分别装载到对应的寄存器中, RCC_APB2PeriphClockCmd(LED_G_GPIO_CLK, ENABLE);                                                //APB2时钟使能函数,打开GPIOB的时钟 } 正确程序: #include "bsp_led.h" void LED_GPIO_Config(void)                                                                                        //LED_用到的GPIO0配置函数, { GPIO_InitTypeDef                 GPIO_InitStruct;                                                        //按照GPIO_InitTypeDef这种结构体(表格)的格式,定义了一个新的结构体,名字叫GPIO_InitStruct         GPIO_InitStruct.GPIO_Pin     =     LED_G_GPIO_PIN;                                        //把具体的参数输入到表格中, GPIO_InitStruct.GPIO_Mode    =     GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Speed   =     GPIO_Speed_50MHz;         RCC_APB2PeriphClockCmd(LED_G_GPIO_CLK, ENABLE);                                                //APB2时钟使能函数,打开GPIOB的时钟 GPIO_Init(LED_G_GPIO_PORT, &GPIO_InitStruct);                                                //利用初始化函数,把初始化GPIO需要用到的参数分别装载到对应的寄存器中, } 原因:应当先开时钟,再初始化 SPIO。
    11. STM32的函数ssert_param(IS_GPIO_ALL_PERIPH(GPIOx)); 2012-09-04  LC书房斋   阅 3812  转 67 转藏到我的图书馆 我们在学STM32的时候函数assert_param出现的几率非常大,上网搜索一下,网上一般解释断言机制,做为程序开发调试阶段时使用。下面我就谈一下我对这些应用的看法,学习东西抱着知其然也要知其所以然。    4  断言机制函数assert_param       我们在分析库函数的时候,几乎每一个函数的原型有这个函数assert_param();下面以assert_param(IS_GPIO_ALL_PERIPH(GPIOx));为例说一下我的理解,函数的参数IS_GPIO_ALL_PERIPH(GPIOx),我们可以寻找到原型      #define IS_GPIO_ALL_PERIPH(PERIPH) (((*(uint32_t*)&(PERIPH)) == GPIOA_BASE) || \                                                                        ((*(uint32_t*)&(PERIPH)) == GPIOB_BASE) || \   //都是或的关系                                                                        ((*(uint32_t*)&(PERIPH)) == GPIOC_BASE) || \                                                                        ((*(uint32_t*)&(PERIPH)) == GPIOD_BASE) || \                                                                        ((*(uint32_t*)&(PERIPH)) == GPIOE_BASE) || \                                                                        ((*(uint32_t*)&(PERIPH)) == GPIOF_BASE) || \                                                                        ((*(uint32_t*)&(PERIPH)) == GPIOG_BASE)                                                                      ) 这个宏定义的作用就是检查参数PERIPH(外围),判断参数PERIPH是否为GPIOX(A...G)基址中的一个,只要有一个为真则其值为真,否则为假,不用多说,这是C语言中基本的逻辑运算。当然这个库函数也用的很有意思,看:首先对PERIPH进行取址,也就是求地址,&PERIPH,然后对这个地址强制转化为32位的指针,即前面加(uint32_t *),然后通过*进行访问这个地址(指针)中的内容。不多说了,看几遍就能明白。        下面我们再回到assert_param这个函数,这个函数是哪里的呢?在stm32f10x_conf.h寻找到原型如下: #ifdef  USE_FULL_ASSERT     #define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__))     void assert_failed(uint8_t* file, uint32_t line);   好有作用啊() #else     #define assert_param(expr) ((void)0) #endif 这是一个预编译文件,若是定义了USE_FULL_ASSERT这个文件,则执行后面的文件,我们在程序中一般都没什么定义,即执行后面这个语句((void)0),这个语句不用多想,没有定义USE_FULL_ASSERT就是什么也不执行。说的明白点,对上面的那个语句IS_GPIO_ALL_PERIPH(GPIOx)不执行任何操作。若是定义了USE_FULL_ASSERT它,我们调用这个函数assert_param时,及对参数IS_GPIO_ALL_PERIPH(GPIOx)的正确性进行检查,通过一个C语言中的双目运算符来判断,若是返回1,执行语句(void)0,跟上面一样,若是返回0,则执行后面的函数assert_failed((uint8_t *)__FILE__, __LINE__),函数的作用在库函数中有解释,用来指示出错的行数和文件。注意:__FILE__, __LINE__是标准库函数中的宏定义!切记 void assert_failed(uint8_t* file, uint32_t line);刚开始没看明白为什么加在这里,仔细一想是在头文件的函数声明。至于函数实体呢?我们从官方文件的模板中main.c中可以找到。如下:    void assert_failed(u8* file, u32 line) { /* User can add his own implementation to report the file name and line number,    ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */  自己可以写个串口打印信息什么的,同时会将错误的行返回的 /* Infinite loop */ while (1) { } } 英文注释也说明了怎么应用,通过输入参数来确定位置,最简单的方法就是串口打印了,这个函数的主要思想是在输入参数有问题的时候,但是有编译不出来,它可以帮你检查参数的有效性,好处不必多言,自己领悟就行。    继续说明: assert_param是怎样包含进去的呢?我们在stm32f10x_conf.h这个头文件中定义的函数声明还是宏定义,怎么在其它文件中都能应用呢?也很多网上朋友在刚开始学习的时候都遇到编译不过去的问题出现,最后通过在文件中添加USE_STDPERIPH_DRIVER来解决的: 我们可以在整个工程中进行搜索USE_STDPERIPH_DRIVER,通过头文件可以看出,是使用标准外设文件。在stm32f10x.h文件中我们可以搜索到如下情况:            #if !defined  USE_STDPERIPH_DRIVER /** * @brief Comment the line below if you will not use the peripherals drivers.    In this case, these drivers will not be included and the application code will    be based on direct access to peripherals registers    */   #define USE_STDPERIPH_DRIVER #endif #ifdef USE_STDPERIPH_DRIVER   #include "stm32f10x_conf.h" #endif 可以很容易看出来,我们不在那里添加,这个头文件中也给我们设置了开关,只要把第一个的注释去掉,就不用在配置中添加USE_STDPERIPH_DRIVER了,在第二个文件中我们可以知道怎样包含这个控制开关文件了,呵呵。我们也明白为什么我们在写程序的时候只要包含stm32f10x.h就能很容易的包含所有的文件文件了吧,我们只要在stm32f10x_conf.h配置一下就能包含所需要的库文件了。    通过以上可以看出,通过头文件的相互包含,来控制外设以及调试文件的调用,这样我们理清思路,理解起来就好多了。当然在学习中可能有些C语言问题还没有理解透彻,多上网搜一下,或者多看书,很快就搞明白的。
    12. STM32 赋值的请教 5/2353 stm32/stm8 2019-03-30
      ddllxxrr 发表于 2019-3-30 19:50 void SystemInit(void) {         //不报错 } 这个函数的事,不可以这样,考一个吧,它好像负责分配 ...
      有可能。
    13. Proteus8.6 仿真STM32F103的例子 41/70145 stm32/stm8 2019-03-29
      Proteus8.6 仿真STM32F103的例子
    14. 这个是STM32需要用的Keil5吗? 8/3580 stm32/stm8 2019-03-27
      hujj 发表于 2019-3-27 19:50 到KEIL官网去下载一个5.26版的,最新的5.27版也推出了。
      我已经安装 了 keil 5.27的版本 。感谢你。
    15. 这个是STM32需要用的Keil5吗? 8/3580 stm32/stm8 2019-03-27
      chenbingjy 发表于 2019-3-27 18:17 怎么是eclipse?
      eclipse 主要是干什么工作的?
    16. 把       else if 改成 #elif 就好了,前面,没有#的原因。 感谢,大家的回复。
    17. freebsder 发表于 2017-12-29 09:07 为什么要报错?你的main.c并没有save 。。。
      打哪里能看出 没有save  ??

最近访客

< 1/1 >

统计信息

已有17人来访过

  • 芯积分:--
  • 好友:--
  • 主题:13
  • 回复:17

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言