




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
------------- 精选文档-----------------红色的是我加上的程序或改过的程序,黑色的是光盘原版程序试配置STM32系统的主控时钟配置成24M的例子。系统时钟初始化函数//pll: 选择的倍频数,从 2开始,最大值为16voidStm32_Clock_Init(u8PLL){unsignedchartemp=0;MYRCC_DeInit(); //复位并配置向量表RCC->CR|=0x00010000; //外部高速时钟使能 HSEONwhile(!(RCC->CR>>17));// 等待外部时钟就绪RCC->CFGR=0X00000400;//APB1=DIV2;APB2=DIV1;AHB=DIV1;PLL-=2;// 抵消2个单位RCC->CFGR|=PLL<<18; //设置PLL值2~16RCC->CFGR|=1<<16; //PLLSRCONFLASH->ACR|=0x32; //FLASH2 个延时周期RCC->CR|=0x01000000; //PLLONwhile(!(RCC->CR>>25));// 等待PLL锁定RCC->CFGR|=0x00000002;//PLL 作为系统时钟while(temp!=0x02) //等待PLL作为系统时钟设置成功{temp=RCC->CFGR>>2;temp&=0x03;可编辑------------- 精选文档-----------------}}intmain(void){Stm32_Clock_Init(3);/ /系统时钟设置}编写程序外部通道输入一个电压,并用 ADC的DMA 模式采样100个数据,然后用UART将ADC采样的100个电压数据传输到电脑上。void Adc_Init(void){//先初始化IO口RCC->APB2ENR|=1<<2;//使能PORTA口时钟GPIOA->CRL&=0XFFFFFF0F;//PA1anolog输入//通道10/11设置RCC->APB2ENR|=1<<9;//ADC1时钟使能RCC->APB2RSTR|=1<<9;//ADC1复位RCC->APB2RSTR&=~(1<<9);//复位结束RCC->CFGR&=~(3<<14);//分频因子清零//SYSCLK/DIV2=12MADC时钟设置为12M,ADC最大时钟不能超过14M!否则将导致ADC准确度下降!RCC->CFGR|=2<<14;ADC1->CR1&=0XF0FFFF; //工作模式清零可编辑------------- 精选文档-----------------ADC1->CR1|=0<<16; //独立工作模式ADC1->CR1&=~(1<<8); //非扫描模式ADC1->CR2&=~(1<<1); //单次转换模式ADC1->CR2&=~(7<<17);ADC1->CR2|=7<<17; //软件控制转换ADC1->CR2|=1<<20; //使用用外部触发 (SWSTART)!!! 必须使用一个事件来触发ADC1->CR2|=1<<8; //使用DMAADC1->CR2&=~(1<<11); //右对齐ADC1->SQR1&=~(0XF<<20);ADC1->SQR1|=0<<20; //1 个转换在规则序列中 也就是只转换规则序列 1//设置通道1的采样时间ADC1->SMPR2&=~(7<<3); //通道1采样时间清空ADC1->SMPR2|=7<<3; //通道 1 239.5 周期,提高采样时间可以提高精确度ADC1->CR2|=1<<0; //开启AD转换器ADC1->CR2|=1<<3; //使能复位校准while(ADC1->CR2&1<<3);// 等待校准结束该位由软件设置并由硬件清除。在校准寄存器被初始化后该位将被清除。ADC1->CR2|=1<<2; //开启AD校准while(ADC1->CR2&1<<2); //等待校准结束该位由软件设置以开始校准,并在校准结束时由硬件清除可编辑------------- 精选文档-----------------}获取通道ch的转换值,取times次,然后平均//ch:通道编号//times: 获取次数返回值:通道ch的times次转换结果平均值u16Get_Adc_Average(u8ch,u8times){u32temp_val=0;u8t;for(t=0;t<times;t++){temp_val+=Get_Adc(ch);delay_ms(5);}returntemp_val/times;}//pclk2:PCLK2 时钟频率(Mhz)//bound: 波特率voiduart_init(u32pclk2,u32bound){floattemp;u16mantissa;可编辑------------- 精选文档-----------------u16fraction;temp=(float)(pclk2*1000000)/(bound*16);// 得到USARTDIVmantissa=temp; //得到整数部分fraction=(temp-mantissa)*16;// 得到小数部分mantissa<<=4;mantissa+=fraction;RCC->APB2ENR|=1<<2; //使能PORTA口时钟RCC->APB2ENR|=1<<14; //使能串口时钟GPIOA->CRH&=0XFFFFF00F;//IO 状态设置GPIOA->CRH|=0X000008B0;//IO 状态设置RCC->APB2RSTR|=1<<14; //复位串口 1RCC->APB2RSTR&=~(1<<14);// 停止复位波特率设置USART1->BRR=mantissa;// 波特率设置USART1->CR1|=0X200C; //1位停止,无校验位.#ifEN_USART1_RX //如果使能了接收//使能接收中断USART1->CR1|=1<<8; //PE中断使能USART1->CR1|=1<<5; //接收缓冲区非空中断使能MY_NVIC_Init(3,3,USART1_IRQChannel,2);// 组2,最低优先级#endif}可编辑------------- 精选文档-----------------#include"sys.h"#include"usart.h"#include"delay.h"#include"adc.h"intmain(void){u16adcx,i;Stm32_Clock_Init(9); //系统时钟设置uart_init(72,9600); //串口初始化为 9600delay_init(72); //延时初始化Adc_Init(); //ADC 初始化while(1){for(i=0;i<100;i++)// 采集100个数据,循环 100次{adcx=Get_Adc_Average(ADC_CH1,10);// 转换一次USART1->DR=adcx;// 把数据送到发送缓存区while((USART1->SR&(1<<6))==0);// 等待发送完成USART1->SR&=~(1<<6);// 清除标志位}}}可编辑------------- 精选文档-----------------GPIO口实现LED1灯以0.1s闪烁2s。初始化PB5和PE5为输出口.并使能这两个口的时钟//LEDIO 初始化voidLED_Init(void){RCC->APB2ENR|=1<<3; //使能PORTB时钟RCC->APB2ENR|=1<<6; //使能PORTE时钟GPIOB->CRL&=0XFF0FFFFF;GPIOB->CRL|=0X00300000;//PB.5 推挽输出GPIOB->ODR|=1<<5; //PB.5 输出高GPIOE->CRL&=0XFF0FFFFF;GPIOE->CRL|=0X00300000;//PE.5 推挽输出GPIOE->ODR|=1<<5; //PE.5输出高}通用定时器3中断初始化这里时钟选择为APB1的2倍,而APB1为36M//arr:自动重装值。//psc:时钟预分频数这里使用的是定时器3!voidTIM3_Int_Init(u16arr,u16psc){可编辑------------- 精选文档-----------------RCC->APB1ENR|=1<<1; //TIM3 时钟使能TIM3->ARR=arr; //设定计数器自动重装值 //刚好1msTIM3->PSC=psc; //预分频器 7200,得到10Khz 的计数时钟TIM3->DIER|=1<<0; //允许更新中断TIM3->CR1|=0x01; //使能定时器 3MY_NVIC_Init(1,3,TIM3_IRQChannel,2);// 抢占1,子优先级 3,组2}#include"sys.h"#include"timer.h"#include"led.h"intmain(void){Stm32_Clock_Init(9);//系统时钟设置LED_Init();TIM3_Int_Init(499,7199);//10Khz的计数频率,计数500次为0.05swhile(1){}}u16c=40;// 定义40次,正好是 2svoidTIM3_IRQHandler(void){可编辑------------- 精选文档-----------------if(TIM3->SR&0X0001)// 溢出中断{if(c){LED1=!LED1;c--;}}TIM3->SR&=~(1<<0);// 清除中断标志位}PWM//TIM3PWM 部分初始化//PWM 输出初始化//arr:自动重装值//psc:时钟预分频数voidTIM3_PWM_Init(u16arr,u16psc){此部分需手动修改IO口设置RCC->APB1ENR|=1<<1; //TIM3 时钟使能RCC->APB2ENR|=1<<3; //使能PORTB时钟GPIOB->CRL&=0XFF0FFFFF; //PB5 输出GPIOB->CRL|=0X00B00000; //复用功能输出RCC->APB2ENR|=1<<0;//开启辅助时钟AFIO->MAPR&=0XFFFFF3FF;//清除MAPR的[11:10]可编辑------------- 精选文档-----------------AFIO->MAPR|=1<<11; //部分重映像,TIM3_CH2->PB5TIM3->ARR=arr; //设定计数器自动重装值TIM3->PSC=psc; //预分频器不分频TIM3->CCMR1|=7<<12;//CH2PWM2模式TIM3->CCMR1|=1<<11;//CH2预装载使能TIM3->CCER|=1<<4;//OC2输出使能TIM3->CR1=0x0080;//ARPE使能TIM3->CR1|=0x01;//使能定时器3}#include"sys.h"#include"timer.h"intmain(void){Stm32_Clock_Init(9); //系统时钟设置TIM3_PWM_Init(899,0); //不分频。PWM频率=72000/(899+1)=80KhzTIM3->CCR2=200;// 占空比赋值while(1){}可编辑------------- 精选文档-----------------}CAN/CAN初始化//tsjw:重新同步跳跃时间单元.范围:1~3;//tbs2:时间段2的时间单元.范围:1~8;//tbs1:时间段1的时间单元.范围:1~16;//brp:波特率分频器.范围:1~1024;(实际要加1,也就是1~1024)tq=(brp)*tpclk1//注意以上参数任何一个都不能设为0,否则会乱.波特率=Fpclk1/((tbs1+tbs2+1)*brp);//mode:0,普通模式;1,回环模式;//Fpclk1的时钟在初始化的时候设置为36M,如果设置CAN_Normal_Init(1,8,7,5,1);则波特率为:36M/((8+7+1)*5)=450Kbps返回值:0,初始化OK;其他,初始化失败;u8CAN_Mode_Init(u8tsjw,u8tbs2,u8tbs1,u16brp,u8mode){u16i=0;if(tsjw==0||tbs2==0||tbs1==0||brp==0)return1;tsjw-=1;// 先减去1.再用于设置tbs2-=1;可编辑------------- 精选文档-----------------tbs1-=1;brp-=1;RCC->APB2ENR|=1<<2; //使能PORTA时钟GPIOA->CRH&=0XFFF00FFF;GPIOA->CRH|=0X000B8000;//PA11RX,PA12TX 推挽输出GPIOA->ODR|=3<<11;RCC->APB1ENR|=1<<25;// 使能CAN时钟 CAN使用的是 APB1的时钟(max:36M)CAN->MCR=0x0000; //退出睡眠模式(同时设置所有位为 0)CAN->MCR|=1<<0; //请求CAN进入初始化模式while((CAN->MSR&1<<0)==0){i++;if(i>100)return2;// 进入初始化模式失败}CAN->MCR|=0<<7; //非时间触发通信模式CAN->MCR|=0<<6; //软件自动离线管理CAN->MCR|=0<<5; //睡眠模式通过软件唤醒 (清除CAN->MCR 的SLEEP位)CAN->MCR|=1<<4; //禁止报文自动传送CAN->MCR|=0<<3; //报文不锁定,新的覆盖旧的CAN->MCR|=0<<2; //优先级由报文标识符决定CAN->BTR=0x00000000;// 清除原来的设置 .可编辑------------- 精选文档-----------------CAN->BTR|=mode<<30; //模式设置 0,普通模式;1,回环模式;CAN->BTR|=tsjw<<24;// 重新同步跳跃宽度 (Tsjw)为tsjw+1 个时间单位CAN->BTR|=tbs2<<20;//Tbs2=tbs2+1 个时间单位CAN->BTR|=tbs1<<16; //Tbs1=tbs1+1 个时间单位CAN->BTR|=brp<<0; //分频系数(Fdiv)为brp+1//波特率:Fpclk1/((Tbs1+Tbs2+1)*Fdiv)CAN->MCR&=~(1<<0); //请求CAN退出初始化模式while((CAN->MSR&1<<0)==1){i++;if(i>0XFFF0)return3;//退出初始化模式失败}//过滤器初始化CAN->FMR|=1<<0;//过滤器组工作在初始化模式CAN->FA1R&=~(1<<0);//过滤器0不激活CAN->FS1R|=1<<0;//过滤器位宽为32位.CAN->FM1R|=0<<0;//过滤器0工作在标识符屏蔽位模式CAN->FFA1R|=0<<0;//过滤器0关联到FIFO0CAN->sFilterRegister[0].FR1=0X00000000;//32位IDCAN->sFilterRegister[0].FR2=0X00000000;//32位MASKCAN->FA1R|=1<<0;//激活过滤器0CAN->FMR&=0<<0;//过滤器组进入正常模式可编辑------------- 精选文档-----------------#ifCAN_RX0_INT_ENABLE使用中断接收CAN->IER|=1<<1; //FIFO0 消息挂号中断允许 .MY_NVIC_Init(1,0,USB_LP_CAN_RX0_IRQChannel,2);// 组2#endifreturn0;}/id:标准ID(11位)/扩展ID(11 位+18位)//ide:0, 标准帧;1,扩展帧//rtr:0, 数据帧;1,远程帧//len:要发送的数据长度 (固定为8个字节,在时间触发模式下 ,有效数据为 6个字节)//*dat: 数据指针.返回值:0~3,邮箱编号.0XFF,无有效邮箱.u8Can_Tx_Msg(u32id,u8ide,u8rtr,u8len,u8*dat){u8mbox;if(CAN->TSR&(1<<26))mbox=0;//邮箱0为空elseif(CAN->TSR&(1<<27))mbox=1;//邮箱1为空elseif(CAN->TSR&(1<<28))mbox=2;//邮箱2为空elsereturn0XFF;//无空邮箱,无法发送CAN->sTxMailBox[mbox].TIR=0;//清除之前的设置if(ide==0)//标准帧可编辑------------- 精选文档-----------------{id&=0x7ff;// 取低11位stdidid<<=21;}else //扩展帧{id&=0X1FFFFFFF;// 取低32位extidid<<=3;}CAN->sTxMailBox[mbox].TIR|=id;CAN->sTxMailBox[mbox].TIR|=ide<<2;CAN->sTxMailBox[mbox].TIR|=rtr<<1;len&=0X0F;// 得到低四位CAN->sTxMailBox[mbox].TDTR&=~(0X0000000F);CAN->sTxMailBox[mbox].TDTR|=len; //设置DLC.待发送数据存入邮箱.CAN->sTxMailBox[mbox].TDHR=(((u32)dat[7]<<24)|((u32)dat[6]<<16)|((u32)dat[5]<<8)|((u32)dat[4]));CAN->sTxMailBox[mbox].TDLR=(((u32)dat[3]<<24)|((u32)dat[2]<<16)|((u32)dat[1]<<8)|可编辑------------- 精选文档-----------------((u32)dat[0]));CAN->sTxMailBox[mbox].TIR|=1<<0;// 请求发送邮箱数据returnmbox;}接收数据//fifox: 邮箱号//id:标准ID(11位)/扩展ID(11位+18 位)//ide:0, 标准帧;1,扩展帧//rtr:0, 数据帧;1,远程帧//len:接收到的数据长度 (固定为8个字节,在时间触发模式下 ,有效数据为 6个字节)//dat:数据缓存区voidCan_Rx_Msg(u8fifox,u32*id,u8*ide,u8*rtr,u8*len,u8*dat){*ide=CAN->sFIFOMailBox[fifox].RIR&0x04;// 得到标识符选择位的值if(*ide==0)// 标准标识符{*id=CAN->sFIFOMailBox[fifox].RIR>>21;}else //扩展标识符{*id=CAN->sFIFOMailBox[fifox].RIR>>3;}*rtr=CAN->sFIFOMailBox[fifox].RIR&0x02; //得到远程发送请求值 .可编辑------------- 精选文档-----------------*len=CAN->sFIFOMailBox[fifox].RDTR&0x0F;// 得到DLC//*fmi=(CAN->sFIFOMailBox[FIFONumber].RDTR>>8)&0xFF;// 得到FMI//接收数据dat[0]=CAN->sFIFOMailBox[fifox].RDLR&0XFF;dat[1]=(CAN->sFIFOMailBox[fifox].RDLR>>8)&0XFF;dat[2]=(CAN->sFIFOMailBox[fifox].RDLR>>16)&0XFF;dat[3]=(CAN->sFIFOMailBox[fifox].RDLR>>24)&0XFF;dat[4]=CAN->sFIFOMailBox[fifox].RDHR&0XFF;dat[5]=(CAN->sFIFOMailBox[fifox].RDHR>>8)&0XFF;dat[6]=(CAN->sFIFOMailBox[fifox].RDHR>>16)&0XFF;dat[7]=(CAN->sFIFOMailBox[fifox].RDHR>>24)&0XFF;if(fifox==0)CAN->RF0R|=0X20;// 释放FIFO0邮箱elseif(fifox==1)CAN->RF1R|=0X20;// 释放FIFO1邮箱}//按键初始化函数voidKEY_Init(void){RCC->APB2ENR|=1<<2; //使能PORTA时钟RCC->APB2ENR|=1<<6; //使能PORTE时钟GPIOA->CRL&=0XFFFFFFF0; //PA0 设置成输入,默认下拉GPIOA->CRL|=0X00000008;GPIOE->CRL&=0XFFF000FF; //PE2~4 设置成输入可编辑------------- 精选文档-----------------GPIOE->CRL|=0X00088800;GPIOE->ODR|=7<<2; //PE2~4 上拉}按键处理函数返回按键值//mode:0, 不支持连续按;1,支持连续按;//0,没有任何按键按下//1,KEY0按下//2,KEY1按下//3,KEY2按下//4,KEY3按下 WK_UP注意此函数有响应优先级,KEY0>KEY1>KEY2>KEY3!!u8KEY_Scan(u8mode){staticu8key_up=1;// 按键按松开标志if(mode)key_up=1; //支持连按if(key_up&&(KEY0==0||KEY1==0||KEY2==0||KEY3==1)){delay_ms(10);// 去抖动key_up=0;if(KEY0==0)return1;elseif(KEY1==0)return2;可编辑------------- 精选文档-----------------elseif(KEY2==0)return3;elseif(KEY3==1)return4;}elseif(KEY0==1&&KEY1==1&&KEY2==1&&KEY3==0)key_up=1;return0;// 无按键按下}#include"sys.h"#include"delay.h"#include"key.h"#include"lcd.h"#include"can.h"//ALIENTEK 战舰STM32 开发板实验 25//CAN 实验技术支持:广州市星翼电子科技有限公司intmain(void){u8key;u8i=0,t=0;u8cnt=0;u8canbuf[8];u8res;u8mode=1;//CAN 工作模式;0,普通模式;1,环回模式可编辑------------- 精选文档-----------------Stm32_Clock_Init(9); //系统时钟设置uart_init(72,9600); //串口初始化为 9600delay_init(72); //延时初始化 //初始化与 LED连接的硬件接口LCD_Init(); //初始化LCDKEY_Init(); //按键初始化CAN_Mode_Init(1,8,7,5,mode);//CAN 初始化,波特率450KbpsPOINT_COLOR=RED;// 设置字体为红色LCD_ShowString(60,50,200,16,16,"WarShipSTM32");LCD_ShowString(60,70,200,16,16,"CANTEST");LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");LCD_ShowString(60,110,200,16,16,"2012/9/11");LCD_ShowString(60,130,200,16,16,"LoopBackMode");LCD_ShowString(60,150,200,16,16,"KEY0:Send WK_UP:Mode");// 显示提示信息POINT_COLOR=BLUE;// 设置字体为蓝色LCD_ShowString(60,170,200,16,16,"Count:"); //显示当前计数值LCD_ShowString(60,190,200,16,16,"SendData:"); //提示发送的数据LCD_ShowString(60,250,200,16,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025合作方加工定做合同标准要求
- 2025正规小学教师劳动合同样本
- 2025解除建筑工程的设计合同协议书
- 2025房地产项目合同文本
- 2025科技有限公司合同模板
- 2025建筑模板承包合同模板班组承包合同
- 2025年合作协议的合同范本
- 2025国有企业固定资产人民币贷款合同
- 2025珠宝加盟的合同
- 《下肢深静脉血栓形成》课件
- 第18课《井冈翠竹》课件-2024-2025学年统编版语文七年级下册
- 公立医院成本核算指导手册
- 年产10吨功能益生菌冻干粉的工厂设计改
- 耳聋与人工耳蜗植入术课件
- 三年级上册语文阅读同步扩展课件-第十五讲 童话寓言的阅读技巧(共14张PPT)-人教(部编版)
- 机油滤清器工作原理剖析
- 执行异议及复议课件
- 安全生产管理组织机构设置图
- 智能健身镜行业分析及案例
- 中联HIS系统挂号收费 操 作 说 明
- HIT(肝素诱导的血小板减少症)课件
评论
0/150
提交评论