这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » (NRF24L01驱动成功)hanshuyujifen2的 ARM DIY进程贴

共191条 7/20 |‹ 5 6 7 8 9 10 ›| 跳转至
专家
2012-04-12 09:50:51     打赏
61楼
恭喜恭喜啊

高工
2012-04-12 22:28:46     打赏
62楼
ST的GUI库里边好多错的

这几个图是我一个个地改的

专家
2012-04-13 07:04:44     打赏
63楼
原理图与PCB不符,怎么会这样,楼主能不能具体说一下。

工程师
2012-04-13 07:57:24     打赏
64楼
恭喜,看着不错,我也抓紧了

菜鸟
2012-04-14 09:29:38     打赏
65楼
不错的,学习了

菜鸟
2012-04-14 09:57:10     打赏
66楼
不错的,学习了

菜鸟
2012-04-14 18:07:54     打赏
67楼

对于您发现 液晶问题 表示感谢,可以不用再走弯路了


高工
2012-04-14 22:14:05     打赏
68楼
换了进口的MAX3232,六块一片。串口OK了  工作了几个小时都没问题。

垃圾片子真不能用啊,好的片子一个就行了

高工
2012-04-15 21:30:39     打赏
69楼
Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE MicrosoftInternetExplorer4 /* Style Definitions */ table.MsoNormalTable { mso-style-parent:""; font-size:10.5pt;"Calibri","sans-serif"; mso-bidi-"Times New Roman";} 使用库里的模板,外接12MHz晶振的设置方法 遇见的问题: 串口芯片搞定了,想使用ST库模板,进行串口通信实验。遇见问题:配置好串口之后,发送数据,由于晶振频率设置的不正确,接收到的数据全是乱码。 库模板里边,是针对内部8MHz晶振设置系统时钟的。系统启动之后,自动设置使用内部8MHZ晶振。因此要使用外部晶振需要对模板进行一些修改。一下是我今天修改模板以使用12M晶振的过程。   首先,main函数最前面的一段文字:

 /*!< At this stage the microcontroller clock setting is already configured,

       this is done through SystemInit() function which is called from startup

       file (startup_stm32f10x_xx.s) before to branch to application main.

       To reconfigure the default setting of SystemInit() function, refer to

       system_stm32f10x.c file

     */

系统在进入Main函数之前,已经配置好了系统时钟。即在启动文件startup_stm32f10x_hd_vl.s里边,已经调用SystemInit()设置了系统时钟。 找到SystemInit函数,定义如下(代码过长,根据预定义(STM32F10X_HD_VL)删除了不必要的): void SystemInit (void) {  

 /* Reset the RCC clock configuration to the default reset state(for debug purpose) */

 /* Set HSION bit 开启内部8MHz振荡器 */

 RCC->CR |= (uint32_t)0x00000001;  

 /* Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits */

 RCC->CFGR &= (uint32_t)0xF0FF0000;//0xF0FF0000;       

 /* Reset HSEON, CSSON and PLLON bits */

 RCC->CR &= (uint32_t)0xFEF6FFFF;  

 /* Reset HSEBYP bit */

//位(16)0:HSEON,关闭外部高速时钟HSE
 //位(19)0:CSSON,关闭时钟安全系统CSS
 //位(24)0:PLLON,关闭PLL

 RCC->CR &= (uint32_t)0xFFFBFFFF;  

 /* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits */

 RCC->CFGR &= (uint32_t)0xFF80FFFF;

      //位(26:24)000:MCO,  没有时钟输出
            //位(15:14)00:ADCPRE,PCLK2 2分频后作为ADC时钟频率 ADCCLK=PCLK2/2
            //位(13:11)000:PPRE2, HCLK不分频给APB2, PCLK2=HCLK
            //位(10:8)000:PPRE1,   HCLK不分频给APB1, PCLK1=HCLK
            //位(7:4)0000:HPRE,     SYSCLK不分频给AHB,HCK=SYSCLK=8Mhz
            //位(3:2)00,SWS,           HSI作为系统时钟(由硬件置1或清0)
            //位(1:0)00,SW,             HSI作为系统时钟SYSCLK=8Mhz

 

 /* Disable all interrupts and clear pending bits */

 RCC->CIR = 0x009F0000;//禁止所有时钟中断,清中断标志位
                                                  //位(23)1:CSSC,清除时钟安全系统中断
                                                  //位(20)1:PLLRDYC,清除PLL就绪中断
                                                  //位(19)1:HSERDYC,清除HSE就绪中断
                                                  //位(18)1:HSIRDYC,清除HSI就绪中断
                                                  //位(17)1:LSERDYC,清除LSE就绪中断
                                                  //位(16)1:LSIRDYC,清除LSI就绪中断
                                                  //位(12)0:PLLRDYIE,PLL就绪中断关闭
                                                  //位(11)0:HSERDYIE,HSE...
                                                  //位(10)0:HSIRDYIE,
                                                  //位( 9)0:LSERDYIE,
                                                  //位( 8)0:LSIRDYIE,
                                                  //位7-0,写0操作无意义

 

 /* Reset CFGR2 register */

 RCC->CFGR2 = 0x00000000;         

 /* 配置系统时钟频率。Configure the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers */

 /* 配置Flash响应周期,并使能预取指缓存Configure the Flash Latency cycles and enable prefetch buffer */

 SetSysClock();   #ifdef VECT_TAB_SRAM  //向量表在SRAM中定义

 SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */

#else                                //向量表在FLASH中定义 

 SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH.*/

#endif }

//SystemInit()函数主要流程如下
//1. RCC_CR时钟控制寄存器,第0位置1,开启内部8Mhz高速时钟HSI
//2. 设置SYSCLK=HSI=8Mhz
//    HCK=SYSCLK=8Mhz
//    PCLK1=HCLK=8Mhz
//    PCLK2=HCLK=8Mhz
//    ADCCLK=PCLK2/2=4Mhz
//    MCO,  没有时钟输出
//3. 关闭HSE外部高速时钟
//    关闭CSS时钟安全系统
//    关闭PLL锁相环
//4. 设置HSE没有被旁路,意思为HSE使用外部晶体,而不是外部时钟源
//5. 复位PLLSRC,PLLXTPRE,PLLMUL,USBPRE,为下一步重新设置新的值做准备
      复位后:
      PLLSRC=HSI/2,   PLL关闭时才可写入
      PLLXTPRE=HSE, PLL关闭时才可写入
      PLLMUL=2,          PLL关闭时才可写入,PLL开启后,PLLMUL的值才有意义,PLL=PLLSRC*PLLMUL
      USBPRE=0,         USBCLK=PLLCLK/1.5,(PLL被关闭,USBCLK同时失效,外部晶振开启成功后变为72/1.5)
//6. 禁止所有时钟中断,清中断标志位
//然后调用SetSysClockTo72()函数继续执行以下功能
//1. HSE外部高速时钟使能
//2. 使能flash预取缓冲区
//    设置SYSCLK与闪存访问时间的比例
//3. 重新设置HCLK,PCLK2,PCLK1
      HCLK = SYSCLK
      PCLK2 = HCLK
      PCLK1 = HCLK /2
//4. 又一次复位PLLSRC,PLLXTPRE,PLLMUL,
      PLLSRC=HSI/2
      PLLXTPRE=HSE不分频
      PLLMUL=2倍频输出
//5. 重设PLLSRC,PLLMUL
      PLLSRC=HSE
      PLLMUL=9倍频
//6. 使能PLL(PLLCLK=PLLSRC*PLLMUL,PLLSRC=HSE=8Mhz,PLLMUL=9)
//7. 设置SYSCLK=PLLCLK=72Mhz

其中SetSysClock函数是设置系统工作频率的,之前的代码都是用来复位时钟的 static void SetSysClock(void) { #ifdef SYSCLK_FREQ_HSE  SetSysClockToHSE(); #elif defined SYSCLK_FREQ_24MHz  SetSysClockTo24(); #elif defined SYSCLK_FREQ_36MHz  SetSysClockTo36(); #elif defined SYSCLK_FREQ_48MHz  SetSysClockTo48(); #elif defined SYSCLK_FREQ_56MHz  SetSysClockTo56();  #elif defined SYSCLK_FREQ_72MHz  SetSysClockTo72(); #endif  

 /* If none of the define above is enabled, the HSI is used as System clock

    source (default after reset) */

} 最后一句的意思是:如果这些参数都没有定义,系统将使用HSI作为系统时钟。

这些参数我都没定义,到现在都搞不懂为啥用的内部8MHz时钟还是乱码

 

//这里定义了一个存储系统时钟频率的变量,利用宏定义给他赋予不同的值
#ifdef SYSCLK_FREQ_HSE
  uint32_t SystemCoreClock         = SYSCLK_FREQ_HSE;        /*!< System Clock Frequency (Core Clock) */
#elif defined SYSCLK_FREQ_24MHz
  uint32_t SystemCoreClock         = SYSCLK_FREQ_24MHz;        /*!< System Clock Frequency (Core Clock) */
#elif defined SYSCLK_FREQ_36MHz
  uint32_t SystemCoreClock         = SYSCLK_FREQ_36MHz;        /*!< System Clock Frequency (Core Clock) */
#elif defined SYSCLK_FREQ_48MHz
  uint32_t SystemCoreClock         = SYSCLK_FREQ_48MHz;        /*!< System Clock Frequency (Core Clock) */
#elif defined SYSCLK_FREQ_56MHz
  uint32_t SystemCoreClock         = SYSCLK_FREQ_56MHz;        /*!< System Clock Frequency (Core Clock) */
#elif defined SYSCLK_FREQ_72MHz
  uint32_t SystemCoreClock         = SYSCLK_FREQ_72MHz;        /*!< System Clock Frequency (Core Clock) */
#else /*!< HSI Selected as System Clock source */
  uint32_t SystemCoreClock         = HSI_Value;        /*!< System Clock Frequency (Core Clock) */
#endif

  文件中定义了:#define SYSCLK_FREQ_HSE    HSE_VALUE 因此将使用外部时钟源作为系统时钟,HSE_VALUE即为外部时钟的频率。查看定义如下: #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)8000000) /*!< Value of the External oscillator in Hz */

#endif /* STM32F10X_CL */    

#endif /* HSE_VALUE */

将 #define HSE_VALUE    ((uint32_t)8000000)

修改为 #define HSE_VALUE    ((uint32_t)12000000)

 即设置了外部时钟为12MHz。 修改后,使用串口发送数据,电脑端接受正常。

高工
2012-04-15 21:48:03     打赏
70楼
参考资料:
stm32启动文件详解及SystemInit函数分析
http://www.ourdev.cn/thread-5466500-1-1.html

共191条 7/20 |‹ 5 6 7 8 9 10 ›| 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]