-
我把库函数中设置时钟的部分贴出来,您给看一下,谢谢!
void SystemInit (void)
{
/*!< RCC system reset(for debug purpose) */
/*!< Set HSION bit */
RCC->CR |= (uint32_t)0x00000001;
/*!< Reset SW[1:0], HPRE[3:0], PPRE1[2:0], PPRE2[2:0], ADCPRE[1:0] and MCO[2:0] bits */
RCC->CFGR &= (uint32_t)0xF8FF0000;
/*!< Reset HSEON, CSSON and PLLON bits */
RCC->CR &= (uint32_t)0xFEF6FFFF;
/*!< Reset HSEBYP bit */
RCC->CR &= (uint32_t)0xFFFBFFFF;
/*!< Reset PLLSRC, PLLXTPRE, PLLMUL[3:0] and USBPRE bits */
RCC->CFGR &= (uint32_t)0xFF80FFFF;
/*!< Disable all interrupts */
RCC->CIR = 0x00000000;
/*!< Configure the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers */
/*!< Configure the Flash Latency cycles and enable prefetch buffer */
SetSysClock();
}
static void SetSysClock(void)
{
#ifdef SYSCLK_FREQ_HSE
SetSysClockToHSE();
#elif defined SYSCLK_FREQ_20MHz
SetSysClockTo20();
#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) */
}
static void SetSysClockTo72(void)
{
__IO uint32_t StartUpCounter = 0, HSEStatus = 0;
/*!< SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/
/*!< Enable HSE */
RCC->CR |= ((uint32_t)RCC_CR_HSEON);
/*!< Wait till HSE is ready and if Time out is reached exit */
do
{
HSEStatus = RCC->CR & RCC_CR_HSERDY;
StartUpCounter++;
} while((HSEStatus == 0) && (StartUpCounter != HSEStartUp_TimeOut));
if ((RCC->CR & RCC_CR_HSERDY) != RESET)
{
HSEStatus = (uint32_t)0x01;
}
else
{
HSEStatus = (uint32_t)0x00;
}
if (HSEStatus == (uint32_t)0x01)
{
/*!< Enable Prefetch Buffer */
FLASH->ACR |= FLASH_ACR_PRFTBE;
/*!< Flash 2 wait state */
FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);
FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;
/*!< HCLK = SYSCLK */
RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
/*!< PCLK2 = HCLK */
RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;
/*!< PCLK1 = HCLK */
RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;
/*!< PLLCLK = 12MHz * 6 = 72 MHz */
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));
RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL9); //HSE输入,HSE二分频,倍频9
// RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL6);
/*!< Enable PLL */
RCC->CR |= RCC_CR_PLLON;
/*!< Wait till PLL is ready */
while((RCC->CR & RCC_CR_PLLRDY) == 0)
{
}
/*!< Select PLL as system clock source */
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;
/*!< Wait till PLL is used as system clock source */
while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08)
{
}
}
else
{ /*!< If HSE fails to start-up, the application will have wrong clock
configuration. User can add here some code to deal with this error */
/*!< Go to infinite loop */
while (1)
{
}
}
}
-
R49 = 1M
C7 , C8 ==20pF;
这些参数是否与你选用的晶体匹配?
-
第二:那个查询方式中还"残存"的那个while()
I2C_GenerateStop(I2Cx, ENABLE);
while((I2C10>CR1&0x200)==0x200);
第一句,通过软件写bit9@CR1,在总线上发出STOP信号;第二句,等待bit9@CR1被硬件清零。
为什么要加上第二句呢。有客户报告说STOP位在产生了STOP信号后不会被清零。
原因在于:按理说,软件置位了STOP位,一旦STOP信号出现在了总线上,该位应该被硬件自动清零。但是如果这两个事件之间,有一个写CR1的操作,而这个写操作是用读-修改-写的方式。那么读的时候,把还未清零的STOP也读了进来,随后又写了回去。这样STOP位就又被置位了。
总而言之,就是如果软件置位STOP位后有对CR1的写操作,最后要等到STOP位被清零后。
这里,后面是对SR的查询和设置(if(I2C_GetFlagStatus(I2Cx, I2C_FLAG_AF))...),并且直接返回错误代码,不要这个while()应该应该也可以。但是LZ的代码死在这里,说明STOP位确实没有清掉咯?按照LZ那样直接退出,那个STOP位还在,下次通信时会有问题的,除非手动把它清零。
另外多说一句,怎么会走到这里,是因为干扰使得不满足slave地址匹配的条件么。即I2C——CheckEvent(I2Cx, I2C_EVENT_MASTER_TRANSIMITTER_MODE_SELECTED)?然后在超时处理后,又由于干扰STOP位都不能清零?
我现在对干扰下的STM32 I2C不正常工作的情况很感兴趣呀,LZ多提供点反馈才好。
-
后来把 INCLUDE oemaddrtab_cfg.inc 放在 ENTRY_END 后面就可以通过了
不知道为什么,你不妨试试看
-
顶。。。。不过真绕。。。。没明白想问什么。。。。。
-
呵呵,不错的注意.
-
能收到数据啊,可是去控制设备的时候就不行了?
-
allegro倒是用了很久,但没用过FPM,
你启动PC试了吗?
建议卸载完重启下PC,然后重装,并看下任务管理器 里面是否有相关的进程。
-
学习~
-
补充一点,我也不知道这个问题应该在哪个小论坛里发表。
-
0x6C00 0000 相当于给你的LCD脚RS 低电平
0x6C00 0001 相当于给你的LCD脚RS 高电平
然后看你的资料 RS 电平不同 操作的内容是不同的
-
#define CLEAR11(x) (x = x & ~(0x1
-
恩,初学者路过看看。。。
-
是件好事
-
你的时序图里面半步接通的电流都是最小级别的。按datasheet里面最大级别的试试吧。
{0x3C, 0x24, 0x27, 0x20, 0x18, 0x00, 0x03, 0x04}正转
-
C基础不行哦
不能在头文件里写函数的实现的。。。。。
-
无语了。。。。。。。
-
从模块闪灯的情况,看起来是模块重启了,
拨号成功之后,指示灯快闪,大约0.5秒一次,
打开网页,输入网址,从调试信息上可以看出,网址信息已经发送出去了
但是过一会儿PPP协议数据就一直在重发数据,好像是通讯出了问题,这个时候我看到指示灯突然熄灭,过三秒钟左右继续闪灯,和查找信号时闪灯间隔相同,过一会儿就恢复到拨号后的闪灯间隔。
我怀疑过时电压不够,于是从台式机上接了一个USB电源,直接接到模块的电源脚上,
也是同样的情况
高手解答一下,谢谢
-
你看下这个吧
http://blog.eeworld.net/nanjianhui/archive/2009/08/20/4466741.aspx
-
两者可能一样也可能不一样。
代码对看门狗的功能设定不同,造成两者时间不一致。
1。代码上电运行后,正常运行状态下,不让狗复位,两者时间不同。
2。代码上电运行后,正常运行状态下,需要狗按时复位,两者时间一致。