完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
嗨马克,
我建议直接在GPIO控制寄存器中写入。您需要设置GPIOx-> CR1 CR2 DDR ... 最好的方法是分析功能并检查设置位并直接写入GPIO控制寄存器。 驱动程序功能是通用的,可以测试不同的情况。 在你的情况下你知道你的引脚配置 - >没有不同的情况,这样做。 我用类似的代码对它进行测试,结果看起来很有趣: // GPIO_Init(OW_PORT,OW_PIN,GPIO_Mode_Out_PP_Low_Fast); //定义为输出 GPIOE-> ODR = 0; GPIOE-> DDR = 0x80; //引脚7输出 GPIOE-> CR1 = 0x80; // 推拉 GPIOE-> CR2 = 0x00; // 慢快 // GPIO_ResetBits(OW_PORT,OW_PIN); //设置低 GPIOE-> ODR = 0x80; //将GPIOE pin7设置为1 _delay_us(5); // GPIO_Init(OW_PORT,OW_PIN,GPIO_Mode_In_PU_No_IT)//定义为输入 GPIOE-> ODR = 0; GPIO-GPIOE-> CR2 = 0; //没有中断 GPIOE-> DDR = 0; // PIN7 INPUT GPIOE-> CR1 = 0x80; // PIN 7 PULL UP _delay_us(5);} 我想这个例子回复了你的请求,让我知道。 RGDS 菲尔 以上来自于谷歌翻译 以下为原文 Hi Marc, I can suggest to write directly in GPIO control registers. You need to set the GPIOx->CR1 CR2 DDR ... The best way is to analyze the function and check the setted bits and write directly in the GPIO control registers. The driver functions are generic and test the different cases. In you case you know your pin configuration --> do it, without the different cases. I test it with a code someting like that quickly the results seems interesting: // GPIO_Init(OW_PORT, OW_PIN, GPIO_Mode_Out_PP_Low_Fast); //define as output GPIOE->ODR = 0; GPIOE->DDR =0x80; // pin 7 output GPIOE->CR1 =0x80; // PUSH PULL GPIOE->CR2 =0x00; // SLOW FAST // GPIO_ResetBits(OW_PORT, OW_PIN); //set low GPIOE->ODR = 0x80; // set GPIOE pin7 to 1 _delay_us(5); // GPIO_Init(OW_PORT, OW_PIN, GPIO_Mode_In_PU_No_IT) //define as input GPIOE->ODR = 0; GPIO-GPIOE->CR2 = 0; // no interrupt GPIOE->DDR = 0; // PIN7 INPUT GPIOE->CR1 =0x80; // PIN 7 PULL UP _delay_us(5);} I think that this example reply to your request, let me know. Rgds Phil |
|
|
|
嗨菲尔,
谢谢。我测试过了。它更快,但仍然不够快。高/低信号现在是18微秒。你有其他建议吗? 谢谢 以上来自于谷歌翻译 以下为原文 Hi Phil, thank you. I've tested it. It's faster, but still not fast enough. The high / low signals are now 18 microseconds. Do you have other suggestions? Thanks |
|
|
|
嗨马克,
很快, 我没有完整的应用程序上下文;我只给你一些提示。 Peharps你可以优化循环;通过将寄存器CR1和CR2置于循环外部。 在这个例子中的其他重点我强制你的其他GPIO位(pin0到6)peharps你需要用OR和AND指令做掩码! 最后一点,我不明白为什么你不减少延迟? RGDS 菲利普 示例(类似......):GPIOE-> ODR = 0; GPIOE-> CR2 = 0x0; GPIOE-> CR1 = 0x80; 而(1){ GPIOE-> DDR = 0x80; //引脚7输出 _delay_us(5); GPIOE-> DDR = 0; // PIN7 INPUT _delay_us(5); } 以上来自于谷歌翻译 以下为原文 Hi Marc, Quickly, I haven't your complete application context; I give to you only some tips. Peharps you can optimize the loop; by put outside the loop the registers CR1 and CR2. Other important point in this example I force the other GPIO bits (pin0 to 6) peharps in your case you need to do mask with OR and AND instructions !!! Last point, I don't understand why you don't reduve the delay? Rgds Philippe Example (something like that....): GPIOE->ODR = 0; GPIOE->CR2 =0x0; GPIOE->CR1 =0x80; while(1){ GPIOE->DDR =0x80; // pin 7 output _delay_us(5); GPIOE->DDR = 0; // PIN7 INPUT _delay_us(5); } |
|
|
|
嗨菲尔,嗨马克,
问题是否与GPIO响应时间一致。 我使用函数GPIO_Init和GPIO_MODE_OUT_PP_LOW_FAST用于o / p& GPIO_MODE_IN_FL_IT 对于i / p 应该是10Mhz,GPIO_WriteHigh& GPIO_WriteLow以及 GPIO_ReadInputPin。 这些功能中的每一个都直接写入寄存器GPIOX-> ODR。 但响应时间非常缓慢。 我把时钟配置为16Mhz&使用HSI振荡器。 在一个while循环中,当我根据配置为i / p的GPIO引脚的状态点亮一个LED时,似乎有一个明显的滞后大约1-2秒,这是令人惊讶的 即使我在中断服务程序中点亮LED,它也是一样的 你知道为什么会发生这种情况吗? 我正在使用STM8S-Discovery board& SDCC编译器& STVP flash工具 以上来自于谷歌翻译 以下为原文 Hi Phil, Hi Marc, Is the problem identified with the GPIO response times.? I used the functions GPIO_Init with GPIO_MODE_OUT_PP_LOW_FAST for o/p & GPIO_MODE_IN_FL_IT for i/p which is supposed to 10Mhz, and the GPIO_WriteHigh & GPIO_WriteLow as well as GPIO_ReadInputPin. Each of these functions are directly writing to the registers GPIOX->ODR. But the response time is painfully slow. I have configured my clock as 16Mhz & using HSI oscillator. In a while loop when i light an led depending on the state of a GPIO pin configured as i/p, there seems to be a distinct lag of around 1-2secs, which is surprising It's the same even when i light the led in an interrupt service routine Do you any idea as to why this could be happening I am using STM8S-Discovery board & SDCC compiler & STVP flash tool |
|
|
|
只有小组成员才能发言,加入小组>>
请教:在使用UDE STK时,单片机使用SPC560D30L1,在配置文件怎么设置或选择?里面只有SPC560D40的选项
2590 浏览 1 评论
3194 浏览 1 评论
请问是否有通过UART连接的两个微处理器之间实现双向值交换的方法?
1769 浏览 1 评论
3592 浏览 6 评论
5972 浏览 21 评论
924浏览 4评论
1300浏览 4评论
在Linux上安装Atollic TRUEStudio的步骤有哪些呢?
566浏览 3评论
使用DMA激活某些外设会以导致外设无法工作的方式生成代码是怎么回事
1287浏览 3评论
1338浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-10 16:01 , Processed in 0.932796 second(s), Total 51, Slave 46 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号