自己整理的STM32代码_第1页
自己整理的STM32代码_第2页
自己整理的STM32代码_第3页
自己整理的STM32代码_第4页
自己整理的STM32代码_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、用户可通过多个预分频器配置ahb、高速apb(apb2)和低速apb(apb1)域的频率。ahb和apb2域的最大频率是72mhz。apb1域的最大允许频率是36mhz。rcc通过ahb时钟8分频后供给cortex系统定时器的外部时钟。通过对systick控制与状态寄存器的设置,可选择上述时钟或cortex ahb时钟作为systick时钟。adc时钟由高速apb2时钟经2、4、6或8分频后获得。定时器时钟频率是其所在apb总线频率的两倍。然而,如果相应的apb预分频系数是1,定时器的时钟频率与所在apb总线频率一致。fclk是cortex-m3的自由运行时钟。详情见arm的cortex-m3

2、技术参考手册。定时器计算公式:(1+tim_prescaler )/72m)*(1+tim_period )=(1+7199)/72m)*(1+9999)=1秒 定时器初始化程序 pwm计算公式:输出频率=时钟/(arr+1) 占空比=ccrx/arr x 100%void inittimer2_tim(void) tim_timebaseinittypedef tim_initstructure; nvic_inittypedef nvic_initstructure; nvic_initstructure.nvic_irqchannel = tim2_irqchannel; nvic_in

3、itstructure.nvic_irqchannelpreemptionpriority = 2; nvic_initstructure.nvic_irqchannelsubpriority = 1; nvic_initstructure.nvic_irqchannelcmd = enable; nvic_init(&nvic_initstructure); /配置时钟 rcc_apb1periphclockcmd(rcc_apb1periph_tim2, enable); tim_cmd(tim2, disable); tim_initstructure.tim_period = 3600

4、; /设置自动装载寄存器,4ms tim_initstructure.tim_countermode = tim_countermode_up; /向上计数 tim_initstructure.tim_prescaler = 79; /预分频 tim_initstructure.tim_clockdivision = tim_ckd_div1; /输入内部时钟频率是否倍频 /tim_initstructure.tim_repetitioncounter=0; tim_timebaseinit(tim2, &tim_initstructure); tim_itconfig(tim2, tim_i

5、t_update, enable); /开定时中断 tim_cmd(tim2, enable); /使能timer2 usart口初始化程序#include all.h/#define send_mode_dma/dma发送方式开关/#define usart1_use#define usart3_use#define usart1_rate 4800#define usart2_rate 4800#define usart3_rate 4800static void inithw_usart(void);/*初始化部分* *初始化硬件包括: *rcc初始化 *gpio初始化 *nvic初始化

6、 *配置初始化:包括使能、传输模式等 *变量初始化: *发送和接收缓存区初始化 */static void inithw_usart(void) usart_inittypedef usart_initstructure; gpio_inittypedef gpio_initstructure; nvic_inittypedef nvic_initstructure;#ifdef usart2_use /配置485收发控制io(默认接收,低电平) gpio_initstructure.gpio_pin = gpio_pin_0; gpio_initstructure.gpio_speed =

7、gpio_speed_50mhz; gpio_initstructure.gpio_mode = gpio_mode_out_pp; gpio_init(gpioa, &gpio_initstructure); gpio_resetbits(gpioa, gpio_pin_0); /使能时钟 rcc_apb1periphclockcmd(rcc_apb1periph_usart2, enable); /中断优先级 nvic_initstructure.nvic_irqchannel = usart2_irqchannel; nvic_initstructure.nvic_irqchannelp

8、reemptionpriority = 0; nvic_initstructure.nvic_irqchannelsubpriority = 0; nvic_initstructure.nvic_irqchannelcmd = enable; nvic_init(&nvic_initstructure); /配置接收管脚pa3 gpio_initstructure.gpio_pin = gpio_pin_3; gpio_initstructure.gpio_speed = gpio_speed_50mhz; gpio_initstructure.gpio_mode = gpio_mode_in

9、_floating; gpio_init(gpioa, &gpio_initstructure); /配置发送管脚pa2 gpio_initstructure.gpio_pin = gpio_pin_2; gpio_initstructure.gpio_speed = gpio_speed_50mhz; gpio_initstructure.gpio_mode = gpio_mode_af_pp; gpio_init(gpioa, &gpio_initstructure); /波特率、字长、停止位、奇偶校验位、硬件流控制、异步串口为默认(被屏蔽字设置) usart_initstructure.

10、usart_baudrate = usart2_rate; usart_initstructure.usart_wordlength = usart_wordlength_8b; usart_initstructure.usart_stopbits = usart_stopbits_1; usart_initstructure.usart_parity = usart_parity_no; usart_initstructure.usart_hardwareflowcontrol = usart_hardwareflowcontrol_none; usart_initstructure.usa

11、rt_mode = usart_mode_rx | usart_mode_tx; usart_init(usart2, &usart_initstructure); /开接收中断 usart_itconfig(usart2, usart_it_rxne, enable); /#ifdef send_mode_dma /发送启用dma模式 / usart_dmacmd(usart2, usart_dmareq_tx, enable); #else /开发送中断 usart_itconfig(usart2, usart_it_tc, enable); /#endif /使能usart usart_

12、cmd(usart2, enable);#endif #ifdef usart3_use /使能时钟 rcc_apb1periphclockcmd(rcc_apb1periph_usart3, enable); /中断优先级 nvic_initstructure.nvic_irqchannel = usart3_irqchannel; nvic_initstructure.nvic_irqchannelpreemptionpriority = 0; nvic_initstructure.nvic_irqchannelsubpriority = 0; nvic_initstructure.nvi

13、c_irqchannelcmd = enable; nvic_init(&nvic_initstructure); /配置接收管脚pb11 gpio_initstructure.gpio_pin = gpio_pin_11; gpio_initstructure.gpio_speed = gpio_speed_50mhz; gpio_initstructure.gpio_mode = gpio_mode_in_floating; gpio_init(gpiob, &gpio_initstructure); /配置发送管脚pb10 gpio_initstructure.gpio_pin = gp

14、io_pin_10; gpio_initstructure.gpio_speed = gpio_speed_50mhz; gpio_initstructure.gpio_mode = gpio_mode_af_pp; gpio_init(gpiob, &gpio_initstructure); /波特率、字长、停止位、奇偶校验位、硬件流控制、异步串口为默认(被屏蔽字设置) usart_initstructure.usart_baudrate = usart3_rate; usart_initstructure.usart_wordlength = usart_wordlength_8b; us

15、art_initstructure.usart_stopbits = usart_stopbits_1; usart_initstructure.usart_parity = usart_parity_no; usart_initstructure.usart_hardwareflowcontrol = usart_hardwareflowcontrol_none; usart_initstructure.usart_mode = usart_mode_rx | usart_mode_tx; usart_init(usart3, &usart_initstructure); usart_cmd

16、(usart3, enable);#endif /-u16 k=0;void init_usart(void) /此函数在sys_cfg()中初始化 inithw_usart();int main(void) /系统初始化 sys_cfg(); g_carderrcode=init_sd(); /sd检测标志位,g_carderrcode=0表示sd卡正常 ,为g_carderrcode=1表示sd卡有问题 /*铁电检测程序*/ writedata_fram( us0, 0x1000, 10, null, 0); delay1us(10000); readdata_fram( us1, 0x1

17、000, 10,null, 0); delay1us(10000); readdata_fram( us1, 0x1000, 10,null, 0); /writesendbuf_usart(us0, 10, 3); gpio_setbits(gpioe, gpio_pin_10 | gpio_pin_11 | gpio_pin_12 | gpio_pin_13 | gpio_pin_14 | gpio_pin_15); rddisplay_led(); /数码管显示函数 while(1) usart_senddata(usart3, 0xbb); k=usart_receivedata(us

18、art3); delay1us(10); k=0; 我用的是usart3,其余的usart口都一样,在网上的代码大多都不是很全,上述相关代码是我自己测试时编写的,拿过来就可以用,需要传输大量数据时自己做个函数就可以了。方便大家学习。stm32的spi配置程序(此程序只是个stm32的配置程序,没有接外围器件所以片选位可以用)static void inithw_spi(void) spi_inittypedef spi_initstructure; gpio_inittypedef gpio_initstructure; nvic_inittypedef nvic_initstructure;

19、#ifdef spi1_use /输出时钟 rcc_apb2periphclockcmd(rcc_apb2periph_gpioa | rcc_apb2periph_gpiob | rcc_apb2periph_spi1, enable); spi_cmd(spi1, disable); gpio_setbits(gpioa, gpio_pin_4); /中断优先级 nvic_initstructure.nvic_irqchannel = spi1_irqchannel; nvic_initstructure.nvic_irqchannelpreemptionpriority = 3; nvi

20、c_initstructure.nvic_irqchannelsubpriority = 2; nvic_initstructure.nvic_irqchannelcmd = enable; nvic_init(&nvic_initstructure); /配置片选 gpio_initstructure.gpio_pin = gpio_pin_4; gpio_initstructure.gpio_speed = gpio_speed_50mhz; gpio_initstructure.gpio_mode = gpio_mode_out_pp; gpio_init(gpioa, &gpio_in

21、itstructure); /配置3线制io gpio_initstructure.gpio_pin = gpio_pin_5 | gpio_pin_6 | gpio_pin_7; gpio_initstructure.gpio_speed = gpio_speed_50mhz; gpio_initstructure.gpio_mode = gpio_mode_af_pp; gpio_init(gpioa, &gpio_initstructure); /配置spi模式:主、双向、8位、模式0、软件片选(3线制)、18m波特率 spi_initstructure.spi_direction =

22、spi_direction_2lines_fullduplex; spi_initstructure.spi_mode = spi_mode_master; spi_initstructure.spi_datasize = spi_datasize_8b; spi_initstructure.spi_cpol = spi_cpol_low; spi_initstructure.spi_cpha = spi_cpha_1edge; spi_initstructure.spi_nss = spi_nss_soft; spi_initstructure.spi_baudrateprescaler =

23、 spi_baudrateprescaler_8; spi_initstructure.spi_firstbit = spi_firstbit_msb; spi_initstructure.spi_crcpolynomial = 7; spi_init(spi1, &spi_initstructure); /无效片选 gpio_setbits(gpioa, gpio_pin_4); /禁止crc spi_calculatecrc(spi1, disable); /开接收中断 /spi_itconfig(spi1, spi_it_rxne, enable); /使能spi spi_cmd(spi

24、1, enable);#endif #ifdef spi2_use /输出时钟 rcc_apb1periphclockcmd(rcc_apb1periph_spi2, enable); /中断优先级 nvic_initstructure.nvic_irqchannel = spi2_irqchannel; nvic_initstructure.nvic_irqchannelpreemptionpriority = 3; nvic_initstructure.nvic_irqchannelsubpriority = 3; nvic_initstructure.nvic_irqchannelcmd

25、 = enable; nvic_init(&nvic_initstructure); /配置片选 gpio_initstructure.gpio_pin = gpio_pin_12; gpio_initstructure.gpio_speed = gpio_speed_50mhz; gpio_initstructure.gpio_mode = gpio_mode_out_pp; gpio_init(gpiob, &gpio_initstructure); /配置3线制io gpio_initstructure.gpio_pin = gpio_pin_13 | gpio_pin_14 | gpi

26、o_pin_15; gpio_initstructure.gpio_speed = gpio_speed_50mhz; gpio_initstructure.gpio_mode = gpio_mode_af_pp; gpio_init(gpiob, &gpio_initstructure); /配置spi模式:主、双向、8位、模式3、软件片选(3线制)、18m波特率 spi_initstructure.spi_direction = spi_direction_2lines_fullduplex; spi_initstructure.spi_mode = spi_mode_master; sp

27、i_initstructure.spi_datasize = spi_datasize_8b; spi_initstructure.spi_cpol = spi_cpol_low; spi_initstructure.spi_cpha = spi_cpha_1edge; spi_initstructure.spi_nss = spi_nss_soft; spi_initstructure.spi_baudrateprescaler = spi_baudrateprescaler_4; spi_initstructure.spi_firstbit = spi_firstbit_msb; spi_

28、initstructure.spi_crcpolynomial = 7; spi_init(spi2, &spi_initstructure); /片选 gpio_setbits(gpiob, gpio_pin_12); /禁止crc spi_calculatecrc(spi2, disable); /开接收中断 / spi_itconfig(spi2, spi_it_rxne, enable); /使能spi spi_cmd(spi2, enable);#endif pwm初始化/*/代码在pa1引脚上产生一个10k左右 50%占空比的方波输出/*/void tim_configuratio

29、n(void)tim_timebaseinittypedef tim_timebasesturcture;tim_ocinittypedef tim_ocinitstructure;gpio_inittypedef gpio_initstructure;/*开启gpioa时钟*/rcc_apb2periphclockcmd(rcc_apb2periph_gpioa ,enable);/*开启tim2时钟*/rcc_apb1periphclockcmd(rcc_apb1periph_tim2,enable);/*初始化pa1,tim2-ch2通道*/gpio_initstructure.gpio

30、_pin = gpio_pin_1;gpio_initstructure.gpio_mode = gpio_mode_af_pp;gpio_initstructure.gpio_speed = gpio_speed_50mhz;gpio_init(gpioa,&gpio_initstructure);/*tim2基本初始化*/tim_timebasesturcture.tim_period = 512; /*周期0ffff*/tim_timebasesturcture.tim_prescaler = 12; /*时钟分频*/tim_timebasesturcture.tim_clockdivi

31、sion = 0; /*时钟分割*/tim_timebasesturcture.tim_countermode = tim_countermode_up; /*模式*/tim_timebaseinit(tim2, &tim_timebasesturcture);/*pwm 通道 初始化*/tim_ocinitstructure.tim_ocmode = tim_ocmode_pwm1; /*工作状态*/tim_ocinitstructure.tim_outputstate = tim_outputstate_enable; /*设定为输出,需要pwm输出才需要这行代码*/tim_ocinits

32、tructure.tim_pulse = 256; /*占空长度 0 周期(max)*/tim_ocinitstructure.tim_ocpolarity = tim_ocpolarity_high; /*高电平*/tim_oc2init(tim2, &tim_ocinitstructure); /*通道初始化*/*开启tim2模块*/tim_cmd(tim2, enable);/*测温程序(内部adc)内部传感器采集误差比较大*/void adc_hardinit(void) adc_inittypedef adc_initstructure; rcc_apb2periphclockcmd

33、(rcc_apb2periph_adc1, enable); /* adc1 configuration -*/ adc_initstructure.adc_mode = adc_mode_independent; adc_initstructure.adc_scanconvmode = enable; adc_initstructure.adc_continuousconvmode = enable; adc_initstructure.adc_externaltrigconv = adc_externaltrigconv_none; adc_initstructure.adc_dataal

34、ign = adc_dataalign_right; adc_initstructure.adc_nbrofchannel = 1; adc_init(adc1, &adc_initstructure); /* adc1 regular channel14 configuration */ adc_regularchannelconfig(adc1, adc_channel_16, 1, adc_sampletime_239cycles5 ); /* enable adc1 */ adc_cmd(adc1, enable); /* enable adc1 reset calibaration

35、register */ adc_resetcalibration(adc1); /* check the end of adc1 reset calibration register */ while(adc_getresetcalibrationstatus(adc1); /* start adc1 calibaration */ adc_startcalibration(adc1); /* check the end of adc1 calibration */ while(adc_getcalibrationstatus(adc1);u16 adc_filter(void)u16 res

36、ult=0;u8 i;for(i=16;i0;i-) /delay2us(1); result += value;return result/16;/u8 adc_getchannel(u8 channel, u16* value) switch (channel) case 0x16: channel = adc_channel_16; adc_tempsensorvrefintcmd(enable); break; case 0x17: channel = adc_channel_17; break; default: channel = adc_channel_16; break; /*

37、 adc1 regular channel14 configuration */ adc_regularchannelconfig(adc1, channel, 1, adc_sampletime_239cycles5); adc_softwarestartconvcmd(adc1, enable); delay2us(100); *value = adc_getconversionvalue(adc1); if(channel = 0x16) adc_tempsensorvrefintcmd(disable); return 0; vs8 temperature=0;temperature_

38、detect() u16 adc; u16 wd; if(!adc_getchannel(0x16, &value) /*supported temperature range: 40 to 125 degrees precision: 1.5 c */ /*temperature (in c) = (v25 - vsense) / avg_slope + 25. avg_slope = 4.3 mv/c v25 = 1.43 v注:这里应用的全为典型值,在datasheet上可以查取。 */ adc=adc_filter(); wd = (1.43 - adc*3.3/4096)*1000/

39、4.35 + 25; delay2us(10); /*stm32的18b20程序*/#include #include all.h/* private define -*/ /rom操作指令/读rom#define read_rom 0x33/匹配rom#define match_rom 0x55/跳过rom#define skip_rom 0xcc/搜索rom#define search_rom 0xf0/告警搜索#define alarm_search 0xec /存储器操作指令/写暂存存储器#define write_scratchpad 0x4e/读暂存存储器#define read_

40、scratchpad 0xbe/复制暂存存储器#define copy_scratchpad 0x48/温度变换#define convert_temperature 0x44/重新调出#define recall_eprom 0xb8/读电源#define read_power_supply 0xb4 /* private macro -*/ u16 ds18b20_pin = (16); /接ds18b20的引脚/#define ds18b20_pin (1odr = (gpiod-odr & ds18b20_pin) | (x ? ds18b20_pin : 0) /具体使用那个端口修改

41、此处#define read_dq gpio_readinputdatabit(gpiod,ds18b20_pin) /也要修改 void us_delay (u16 us) while(us-);void gpioint(void) /pass gpio_inittypedef gpio_initstructure; rcc_apb2periphclockcmd(rcc_apb2periph_gpiod,enable); /打开时钟 gpio_initstructure.gpio_pin = gpio_pin_6; /选择引脚 gpio_initstructure.gpio_mode = g

42、pio_mode_out_od; gpio_initstructure.gpio_speed = gpio_speed_2mhz; gpio_init(gpiod,&gpio_initstructure); /* function name : dqreset* description :送一个复位脉冲(最少保持480s的低电平信号),然后释放总线,mcu进入接收状态,ds1820 在探测到引脚上的上升沿后,延时1560s后,ds1820发出存在脉冲(60240s的低电平信号)。* input : none* output : none* return : none*/u8 dqreset(void) /pass u8 temp; dq(1); us_delay(10

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论