stm32 plck2怎么stm32预分频器

用硬件电路怎么实现stm32与plc通信模块结合_百度知道
用硬件电路怎么实现stm32与plc通信模块结合
我有更好的答案
这两款控制器就不在一个相同的电压等级上有线电路还是无线电路,有线的话需要加电平转换。不知道PLC能不能用无线的
采纳率:76%
来自团队:
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。用于PLC控制的STM32数据采集系统_图文_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
用于PLC控制的STM32数据采集系统
&&PLC控制STM32数据采集系统,水泵自动控制系统
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩2页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
图文详解stm32时钟树.doc 5页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
下载提示
1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。
2.该文档所得收入(下载+内容+预览三)归上传者、原创者。
3.登录后可充值,立即自动返金币,充值渠道很便利
图文详解stm32时钟树图文详解stm32时钟树
你可能关注的文档:
··········
··········
对于广大初次接触STM32的读者朋友(甚至是初次接触ARM器件的读者朋友)来说,在熟悉了开发环境的使用之后,往往“栽倒”在同一个问题上。这问题有个关键字叫:时钟树。 ??众所周知,微控制器(处理器)的运行必须要依赖周期性的时钟脉冲来驱动——往往由一个外部晶体振荡器提供时钟输入为始,最终转换为多个外部设备的周期性运作为末,这种时钟“能量”扩散流动的路径,犹如大树的养分通过主干流向各个分支,因此常称之为“时钟树”。在一些传统的低端8位单片机诸如51,AVR,PIC等单片机,其也具备自身的一个时钟树系统,但其中的绝大部分是不受用户控制的,亦即在单片机上电后,时钟树就固定在某种不可更改的状态(假设单片机处于正常工作的状态)。比如51单片机使用典型的12MHz晶振作为时钟源,则外设如IO口、定时器、串口等设备的驱动时钟速率便已经是固定的,用户无法将此时钟速率更改,除非更换晶振。
而STM32微控制器的时钟树则是可配置的,其时钟输入源与最终达到外设处的时钟速率不再有固定的关系,本文将来详细解析STM32微控制器的时钟树。 ?
图1是STM32微控制器的时钟树,表1是图中各个标号所表示的部件。 标号????????????图1标号释义 1?????内部低速振荡器(LSI,40Khz) 2?????外部低速振荡器(LSE,32.768Khz) 3????外部高速振荡器(HSE,3-25MHz) 4????内部高速振荡器(HIS,8MHz) 5????PLL输入选择位 6????RTC时钟选择位 7????PLL1分频数寄存器 8????PLL1倍频寄存器 9????系统时钟选择位 10? ???USB分频寄存器 11? ???AHB分频寄存器 12? ???APB1分频寄存器 13? ???AHB总线 14? ???APB1外设总线 15? ???APB2分频寄存器 16???????APB2外设总线 17? ???ADC预分频寄存器 18? ???ADC外设 19? ???PLL2分频数寄存器 20? ???PLL2倍频寄存器 21? ???PLL时钟源选择寄存器 22? ???独立看门狗设备 23???????RTC设备 图1??STM32的时钟树 ?????????在认识这颗时钟树之前,首先要明确“主干”和最终的“分支”。假设使用外部8MHz晶振作为STM32的时钟输入源(这也是最常见的一种做法),则这个8MHz便是“主干”,而“分支”很显然是最终的外部设备比如通用输入输出设备(GPIO)。这样可以轻易找出第一条时钟的“脉络”: 3——5——7——21——8——9——11——13 对此条时钟路径做如下解析: 对于3,首先是外部的3-25MHz(前文已假设为8MHz)输入; 对于5,通过PLL选择位预先选择后续PLL分支的输入时钟(假设选择外部晶振); 对于7,设置外部晶振的分频数(假设1分频); 对于21,选择PLL倍频的时钟源(假设选择经过分频后的外部晶振时钟); 对于8,设置PLL倍频数(假设9倍频); 对于9,选择系统时钟源(假设选择经过PLL倍频所输出的时钟); 对于11,设置AHB总线分频数(假设1分频); 对于13,时钟到达AHB总线; 在上一章节中所介绍的GPIO外设属于APB2设备,即GPIO的时钟来源于APB2总线,同样在图1中也可以寻获GPIO外设的时钟轨迹: 3——5——7——21——8——9——11——15——16 对于3,首先是外部的3-25MHz(前文已假设为8MHz)输入; 对于5,?通过PLL选择位预先选择后续PLL分支的输入时钟(假设选择外部晶振); 对于7,设置外部晶振的分频数(假设1分频); 对于21,选择PLL倍频的时钟源(假设选择经过分频后的外部晶振时钟); 对于8,设置PLL倍频数(假设9倍频); 对于9,选择系统时钟源(假设选择经过PLL倍频所输出的时钟); 对于11,设置AHB总线分频数(假设1分频); 对于15,设置APB2总线分频数(假设1分频); 对于16,时钟到达APB2总线; 现在来计算一下GPIO设备的最大驱动时钟速率(各个条件已在上述要点中假设): 1)???由3所知晶振输入为8MHz,由5——21知PLL的时钟源为经过分频后的外部晶振时钟,并且此分频数为1分频,因此首先得出PLL的时钟源为:8MHz?/?1?=?8MHz。 2)???由8、9知PLL倍频数为9,且将PLL倍频后的时钟输出选择为系统时钟,则得出系统时钟为?8MHz?*?9?=?72MHz。 3)???时钟到达AHB预分频器,由11知时钟经过AHB预分频器之后的速率仍为72MHz。 4)???时
正在加载中,请稍后...查看: 2929|回复: 0
stm32的USART1全双工模式程序
对昨天的程序进行修改,完善,加入接收程序!
与天津第四项目部宿舍
#include &stm32f10x.h&
extern unsigned char Receiver_//全局变量定义接收数据
GPIO_InitTypeDef GPIO_InitS
void mysysinit(void);//系统时钟初始
void my_USART_init(void);//初始化
void my_send_byte(unsigned char send_date); //发送一个字节
int main(void)
{
mysysinit();//RCC初始化,时钟设置72MHZ
& &RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);//使能APB2的GPIO_D时钟
&&/*
&&我说怎么老是调不好串口呢?原来是我没有使能时钟啊,光在下面设置PA口有个屁用啊。
&&俗话说的好啊:烧火棍子,不能一头热一头冷不是。
&&哎呀,我怎么就忽略了这个细节啊,多么简单的串口程序啊,竟是让我折腾了半天
&&是这样的你要用串口那么去看电路图,看他的串口用了那个引脚,然后开启那个引脚的时钟,
&&然后在进行设置,这又一次的提醒我,没有时钟啥都没有,也揭示了我在做实验时凸显的一个现象
&&就是下载完毕运行正常,一旦从FLASH区启动代码就没有反应,这是因为,我在用串口下载完毕后
&&它自动调到应用程序区执行,而此时串口已经初始化了,就是在系统中已经开启了时钟,所以显示没问题,可以
&&接收,而我下电在上电,改变BOOT后,直接从USER区域启动加载代码我恰好没有使能PA口,所以就有这样的现象。
&&现在好了,真相大白,我疏忽大意了!
&&不过也好吃一堑长一智。
&&与天津第四项目部宿舍内
&&王均伟
&&*/
& &RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能APB2的GPIO_A时钟
& &RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//使能APB1的USART2时钟
& &RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能APB1的USART2时钟
& &/* Configure PD0 and PD2 in output pushpull mode */
&&GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9| GPIO_Pin_10| GPIO_Pin_11;
&&GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
&&GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
&&GPIO_Init(GPIOD, &GPIO_InitStructure);
my_USART_init();
my_send_byte(0x88);
&&my_send_byte(0x01);
& &my_send_byte(0x02);
& & my_send_byte(0x03);
& && &&&while(1)
& &&&{
& &
& && && &if(Receiver_date==0x19)
& && &{
& && &&&/* Set the GPIOD port pin 8*/
& && && && && & GPIO_SetBits(GPIOD, GPIO_Pin_8 );
& && &}
& && &if(Receiver_date==0x89)
& && &{
& && & /* Clears the GPIOD port pin 8 */
& &&&GPIO_ResetBits(GPIOD, GPIO_Pin_8);
& && &}
& &
}
/***********************************
发送一个字节函数通过串口
************************************/
void my_send_byte(unsigned char send_date )
{
&&while( (USART1-&SR&0x)!=0x80);//发送寄存器为空
& &USART1-&DR=send_
}
/**********************************
& && && & 初始化串口
**********************************/
void my_USART_init()
{
/*USART2的优先级设为5*/
NVIC-&IP[37]=5;
/*开启38号中断即USART2,关闭其他所有外部的中断*/
NVIC-&ISER[1]=0x;& &
/*设置复用模式下的引脚模式为全双工:TX输出推挽复用,RX为输入上拉模式,速度50MHZ*/
& && && && &GPIOA-&CRH=0x;
&&/* 1.开启USART,
*
*/
USART1-&CR1=0x2000;
/* 1.关闭局域网模式
* 2.1个停止位
* 3.CK引脚禁能
*/
USART1-&CR2=0;
/* 1.关闭调制解调模式
* 2.关闭DMA模式
* 3.关闭智能卡、红外模式
*& &4.关闭错误中断
*/
USART1-&CR3=0;
/*& &&&波特率设置
& &&&日
& && &&&王均伟
& && && &天津第四项目部宿舍
& & BRR中的第四位(DIV_Fraction)作为小数,高12位(DIV_MANtissa)作为整数部分,
&&
& & 1,根据公式:波特率=fck/16*usardiv,其中usardivBRR寄存器的值,所以变形得:USARDIV=fck/16*波特率
& & 2.算出来BRR寄存器的值后就要把这个值变成16进制数据写入BRR寄存器中,
& && &遵循以下规则:
& && &小数部分*16=DIV_Fraction或者取近似的值
& && &整数部分直接=DIV_MANtissa
& & 3.把这个16进制值写入BRR寄存器
& & 例如我要算波特率设成9600bps的BRR寄存器值,
& & 1.先求USARDIV=*
& & 2.换成十六进制:DIV_Fraction=16*0.375=0x6
& && && && && && &&&DIV_MANtissa=234=0xea
& & 3.组合并写入寄存器
& && && && && && && &USART2-&BRR=0x0ea6;值得注意的是这里是16位半字操作,所以不要以为是32位。
*/
USART1-&BRR=0x0ea6;
/* 1.开启USART
* 2.开启接收完毕中断
* 3.开启发送功能
*& &4.开启接收功能
*/
USART1-&CR1=0x202c;
void mysysinit()//系统初始化程序
{
ErrorStatus HSEStartUpS//说明标志位
RCC_DeInit();//所有外设全部缺省设置
/* Enable HSE */
RCC_HSEConfig(RCC_HSE_ON);
/* Wait till HSE is ready and if Time out is reached exit */
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus == SUCCESS)//启动成功
{
/*这两条FLASH指令必须加上,不知为啥?不加上就运行几秒后出错,参照系统初始化*/
/* Enable The Prefetch Buffer */
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//FLASH缓存开启
/* Configure the Latency cycle: Set 2 Latency cycles */
&&FLASH_SetLatency(FLASH_Latency_2);&&//设置FLASH这些位表示SYSCLK(系统时钟)周期与闪存访问时间的比例,为010:两个等待状态,当 48MHz & SYSCLK ≤ 72MHz
/* Set PLL clock output to 72MHz using HSE (8MHz) as entry clock */
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);//外部时钟为8M,PLL的输入时钟=8MHZ,倍频系数9,
/* Configure HCLK such as HCLK = SYSCLK */
RCC_HCLKConfig(RCC_SYSCLK_Div1);//设置了啦AHB分频器的分频系数=1,即HCLK=SYSCLK=72MHZ
/* Configure PCLK1 such as PCLK1 = HCLK/2 */
RCC_PCLK1Config(RCC_HCLK_Div2);//设置了APB1外设的时钟频率最大是36M这里是APB1的分频器设为2,PCLK1=HCLK/2=72/2=36MHZ正好是最大值
/* Configure PCLK2 such as PCLK2 = HCLK */
RCC_PCLK2Config(RCC_HCLK_Div1);//设置PLCK2=HCLK=72MHZ,的APB2分频器=1
/* Select the PLL as system clock source */
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//设置了SYSCLK的提供者为PLL,频率由上面算出=72MHZ
/* disable PLL Ready interrupt */
RCC_ITConfig(RCC_IT_PLLRDY, DISABLE);//PLL中断关闭
/* disable PLL Ready interrupt */
RCC_ITConfig(RCC_IT_HSERDY,DISABLE);//HSE中断关闭
/* disable PLL Ready interrupt */
RCC_ITConfig(RCC_IT_HSIRDY, DISABLE); //HSI中断关闭
/* disable PLL Ready interrupt */
RCC_ITConfig(RCC_IT_LSERDY, DISABLE); //LSE中断关闭
/* disable PLL Ready interrupt */
RCC_ITConfig(RCC_IT_LSIRDY, DISABLE); //LSI中断关闭
/* PLL clock divided by 1.5 used as USB clock source */
RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_1Div5);//设置USB的时钟为=72、1.5=48mhz
/* Configure ADCCLK such as ADCCLK = PCLK2/2 */
RCC_ADCCLKConfig(RCC_PCLK2_Div2);//设置ADC时钟=PCLK2/2= 36MHZ
/* disable the LSE */
RCC_LSEConfig(RCC_LSE_OFF);//外部低速晶振关闭
/*DISable the RTC clock */
RCC_RTCCLKCmd(DISABLE);
/* DISable the Clock Security System */
RCC_ClockSecuritySystemCmd(DISABLE);
/* Enable the PLL */
RCC_PLLCmd(ENABLE);//使能PLL
/* PLL ans system clock config */
}
else
{
/* Add here some code to deal with this error */
}
#include &stm32f10x_it.h&
unsigned char Receiver_//全局变量定义接收数据
void NMI_Handler(void)
{
}
/**
&&* @brief&&This function handles Hard Fault exception.
&&* @param&&None
&&* @retval None
&&*/
void HardFault_Handler(void)
{
&&/* Go to infinite loop when Hard Fault exception occurs */
&&while (1)
&&{
&&}
}
/**
&&* @brief&&This function handles Memory Manage exception.
&&* @param&&None
&&* @retval None
&&*/
void MemManage_Handler(void)
{
&&/* Go to infinite loop when Memory Manage exception occurs */
&&while (1)
&&{
&&}
}
/**
&&* @brief&&This function handles Bus Fault exception.
&&* @param&&None
&&* @retval None
&&*/
void BusFault_Handler(void)
{
&&/* Go to infinite loop when Bus Fault exception occurs */
&&while (1)
&&{
&&}
}
/**
&&* @brief&&This function handles Usage Fault exception.
&&* @param&&None
&&* @retval None
&&*/
void UsageFault_Handler(void)
{
&&/* Go to infinite loop when Usage Fault exception occurs */
&&while (1)
&&{
&&}
}
/**
&&* @brief&&This function handles SVCall exception.
&&* @param&&None
&&* @retval None
&&*/
void SVC_Handler(void)
{
}
/**
&&* @brief&&This function handles Debug Monitor exception.
&&* @param&&None
&&* @retval None
&&*/
void DebugMon_Handler(void)
{
}
/**
&&* @brief&&This function handles PendSV_Handler exception.
&&* @param&&None
&&* @retval None
&&*/
void PendSV_Handler(void)
{
}
/**
&&* @brief&&This function handles SysTick Handler.
&&* @param&&None
&&* @retval None
&&*/
void SysTick_Handler(void)
{
}
/******************************************************************************/
/*& && && && &STM32F10x Peripherals Interrupt Handlers& && && && && && && && &*/
/******************************************************************************/
/**
&&* @brief&&This function handles External line 0 interrupt request.
&&* @param&&None
&&* @retval None
&&*/
void EXTI0_IRQHandler(void)
{
&&if(EXTI_GetITStatus(EXTI_Line0) != RESET)
&&{
& & /* Toggle LED1 */
& &
& & /* Clear the&&EXTI line 0 pending bit */
& & EXTI_ClearITPendingBit(EXTI_Line0);
&&}
}
/**
&&* @brief&&This function handles External lines 9 to 5 interrupt request.
&&* @param&&None
&&* @retval None
&&*/
void USART1_IRQHandler(void)
{
if( (USART1-&SR&0x)==0x20) //接收到数据
&&Receiver_date=(USART1-&DR);
USART1-&SR=0;
}复制代码
Powered by

我要回帖

更多关于 stm32定时器预分频 的文章

 

随机推荐