Skip to content

Commit 47050d9

Browse files
committed
添加高级定时器定时器1和时基定时器7、8
1 parent 27df564 commit 47050d9

16 files changed

+751
-96
lines changed

STM32F1_HAL_freeRTOS_Framework/Devices/TFTLCD/TFTLCD.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ BACK_COLOR = BLACK;
9797

9898
/*声明:以下几乎全部参考和移植于正点原子的LCD章节源码和网络上的部分源码,但都是开源代码,本代码也开源,并不用于商业用途*/
9999

100-
100+
/*_______________________只修改下面的DFT_SCAN_DIR也可以,这里就不用动了___________________________________*/
101101
#define USE_HORIZONTAL 0 //定义是否使用横屏 0,竖屏.1,横屏.
102102

103103
/*去FONT.H里面定义字库的编译选项,以缩减FLASH占用*/
@@ -136,6 +136,7 @@ typedef struct
136136
#define D2U_L2R 6 //从下到上,从左到右
137137
#define D2U_R2L 7 //从下到上,从右到左——对于IO驱动,为横屏朝右
138138

139+
/*_______________________用户修改___________________________________*/
139140
#define DFT_SCAN_DIR L2R_D2U //默认的扫描方向
140141

141142
//画笔颜色,都是16位颜色

STM32F1_HAL_freeRTOS_Framework/SYSTEM/PeriphConfig/PeriphConfig.c

Lines changed: 156 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,19 @@
4343
/*
4444
优先级分组为4,只有0~15的16级抢占优先级
4545
46-
优先级
47-
0 1 2 3 4 5 ...
48-
保留 TIM4(时基) 按键外部中断 按键外部中断
49-
TIM3
50-
TIM2
46+
47+
优先级 0 1 2 3 4 5 ...
48+
保留 TIM4(时基) 按键外部中断 按键外部中断 TIM6(辅助时基)
49+
TIM3(PWNM) TIM7(辅助时基)
50+
TIM2(多功能)
51+
*/
52+
53+
/*
54+
CPU内部 FLASH 【0x0800 0000 - 0x080F FFFF】,容量512K(0x80000)字节
55+
CPU内部 SRAM1 【0x2000 0000 - 0x2000 FFFF】,容量64K(0x10000)字节
56+
57+
外部扩展SRAM 在块1区3 【0x6800 0000 - 0x681F FFFF】,容量1M(0x100000)字节
58+
TFT LCD地址 在块1区4 【0x6C000000 | 0x000007FE, +2】, 仅占用2个端口地址(使用A10连接RS引脚)
5159
*/
5260

5361
/*___________________________器件IO配置___________________________________________*/
@@ -856,7 +864,7 @@ void Process_TIM2_IC_CallBack_Channel_4(void)
856864
if(percent < 0) percent = 0;
857865
if(percent > 100) percent = 100.0;
858866
percent /= 100.0;
859-
compare = (float)tim2arr * percent;
867+
compare = ((float)tim2arr) * percent;
860868
switch(channel)
861869
{
862870
case TIM2PWM_Channel_1: TIM2->CCR1=(u32)compare;break;
@@ -871,6 +879,148 @@ void Process_TIM2_IC_CallBack_Channel_4(void)
871879
#endif
872880

873881

882+
/*________________________________________用户定时器1PWM配置_________________________________________________________*/
883+
#if STSTEM_TIM1PWM_ENABLE
884+
TIM_HandleTypeDef TIM1_Handler;
885+
886+
void sys_TIM1PWM_ENABLE(void)
887+
{
888+
889+
TIM_ClockConfigTypeDef sClockSourceConfig;
890+
TIM_MasterConfigTypeDef sMasterConfig;
891+
TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig;
892+
TIM_OC_InitTypeDef sConfigOC;
893+
894+
TIM1_Handler.Instance = TIM1;
895+
TIM1_Handler.Init.Prescaler = (72-1);
896+
TIM1_Handler.Init.CounterMode = TIM_COUNTERMODE_UP;
897+
TIM1_Handler.Init.Period = tim1arr; //重装载值,16位
898+
TIM1_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;
899+
TIM1_Handler.Init.RepetitionCounter = 0;
900+
HAL_TIM_Base_Init(&TIM1_Handler);
901+
902+
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; //时钟源来自内部(不启用外部ETR引脚作为时钟源)
903+
HAL_TIM_ConfigClockSource(&TIM1_Handler, &sClockSourceConfig);
904+
905+
HAL_TIM_PWM_Init(&TIM1_Handler);
906+
907+
/*如果要用主从定时器,参考https://my.oschina.net/u/4315748/blog/3220499*/
908+
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; //不输出信号给其他外设
909+
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; //不使用定时器主从功能,即不用TIM1的定时中断作为其他定时器的计数源
910+
HAL_TIMEx_MasterConfigSynchronization(&TIM1_Handler, &sMasterConfig);
911+
912+
sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE; //默认disable()
913+
sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE; //默认disable
914+
sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_3; //锁定参数级别,如果死区等参数不再变的话就把LOCK调到最高级
915+
/*死区时间设计:DeadTime的8个bits定义如下:DT为死区时间,Tdts为1/72M~13.9ns
916+
DTG[7:5]=0xx => DT = DTG[7:0] x Tdtg, Tdtg = Tdts; 最大1.764us
917+
DTG[7:5]=10x => DT = (64+DTG[5:0]) x Tdtg, Tdtg = 2 x Tdts; 最大3.5288us
918+
DTG[7:5]=110 => DT = (32+DTG[4:0]) x Tdtg, Tdtg = 8 x Tdts; 最大7us
919+
DTG[7:5]=111 => DT = (32+DTG[4:0]) x Tdtg, Tdtg = 16 x Tdts; 最大14us(此时值为0xff)
920+
要3us则设为0xab
921+
*/
922+
sBreakDeadTimeConfig.DeadTime = 0xab; //死区时间设置 0x00~0xff
923+
#if STSTEM_TIM1PWM_useBreak
924+
sBreakDeadTimeConfig.BreakState = TIM_BREAK_ENABLE; //使能或失能TIMx刹车输入
925+
#else
926+
sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
927+
#endif
928+
sBreakDeadTimeConfig.BreakFilter = 0xa; //刹车输入滤波,0x0~0xF
929+
sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_LOW; //刹车输入脚极性
930+
sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE; //默认
931+
HAL_TIMEx_ConfigBreakDeadTime(&TIM1_Handler, &sBreakDeadTimeConfig);
932+
933+
sConfigOC.OCMode = TIM_OCMODE_PWM1; //向上计数时,PWM1模式就是计数小于占空比值(TIMx_CNT<TIMx_CCR1),IO变为有效极性,否则相反
934+
sConfigOC.Pulse = tim1arr/2; //占空比值(捕获比较值,16位)
935+
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; //可选此通道的有效极性为高还是低
936+
sConfigOC.OCNPolarity = TIM_OCNPOLARITY_LOW; //可选互补通道的有效极性
937+
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; //disable就好
938+
sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET; //空闲电平极性选择(没有启用时的电平,谨慎修改)(也有可能是刹车时的电平)
939+
sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
940+
HAL_TIM_PWM_ConfigChannel(&TIM1_Handler, &sConfigOC, TIM_CHANNEL_1);
941+
942+
sConfigOC.Pulse = tim1arr/2;
943+
HAL_TIM_PWM_ConfigChannel(&TIM1_Handler, &sConfigOC, TIM_CHANNEL_2);
944+
945+
sConfigOC.Pulse = tim1arr/2;
946+
HAL_TIM_PWM_ConfigChannel(&TIM1_Handler, &sConfigOC, TIM_CHANNEL_3);
947+
948+
sConfigOC.Pulse = tim1arr/2;
949+
HAL_TIM_PWM_ConfigChannel(&TIM1_Handler, &sConfigOC, TIM_CHANNEL_4);
950+
}
951+
952+
953+
void TIM1_set_Channel_Pulse(u8 channel,float percent)
954+
{
955+
float compare;
956+
if(percent < 0) percent = 0;
957+
if(percent > 100) percent = 100.0;
958+
percent /= 100.0;
959+
compare = ((float)tim1arr) * percent;
960+
switch(channel)
961+
{
962+
case TIM1PWM_Channel_1: TIM1->CCR1=(u32)compare;break;
963+
case TIM1PWM_Channel_2: TIM1->CCR2=(u32)compare;break;
964+
case TIM1PWM_Channel_3: TIM1->CCR3=(u32)compare;break;
965+
case TIM1PWM_Channel_4: TIM1->CCR4=(u32)compare;break;
966+
default:break;
967+
}
968+
}
969+
970+
971+
#endif
972+
973+
/*________________________________________用户定时器6配置_________________________________________________________*/
974+
#if (STSTEM_TIM6_ENABLE) && ((STM32F103xG) || (STM32F103xE))
975+
976+
TIM_HandleTypeDef TIM6_Handler;
977+
void sys_TIM6_ENABLE(void)
978+
{
979+
TIM4_Handler.Instance=TIM6; //基本定时器6
980+
TIM4_Handler.Init.Prescaler = (72-1); //分频系数
981+
TIM4_Handler.Init.CounterMode=TIM_COUNTERMODE_UP; //向上计数器
982+
TIM4_Handler.Init.Period = tim6arr; //自动装载值
983+
TIM4_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1; //时钟分频因子
984+
HAL_TIM_Base_Init(&TIM6_Handler);
985+
986+
HAL_TIM_Base_Start_IT(&TIM6_Handler); //使能定时器6和定时器6更新中断:TIM_IT_UPDATE
987+
}
988+
989+
990+
//定时器6中断服务函数
991+
void TIM6_IRQHandler(void)
992+
{
993+
HAL_TIM_IRQHandler(&TIM6_Handler);
994+
}
995+
996+
#endif
997+
998+
/*________________________________________用户定时器7配置_________________________________________________________*/
999+
#if (STSTEM_TIM7_ENABLE) && ((STM32F103xG) || (STM32F103xE))
1000+
1001+
TIM_HandleTypeDef TIM7_Handler;
1002+
void sys_TIM7_ENABLE(void)
1003+
{
1004+
TIM4_Handler.Instance=TIM7; //基本定时器7
1005+
TIM4_Handler.Init.Prescaler = (72-1); //分频系数
1006+
TIM4_Handler.Init.CounterMode=TIM_COUNTERMODE_UP; //向上计数器
1007+
TIM4_Handler.Init.Period = tim7arr; //自动装载值
1008+
TIM4_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1; //时钟分频因子
1009+
HAL_TIM_Base_Init(&TIM7_Handler);
1010+
1011+
HAL_TIM_Base_Start_IT(&TIM7_Handler); //使能定时器6和定时器7更新中断:TIM_IT_UPDATE
1012+
}
1013+
1014+
1015+
//定时器7中断服务函数
1016+
void TIM7_IRQHandler(void)
1017+
{
1018+
HAL_TIM_IRQHandler(&TIM7_Handler);
1019+
}
1020+
1021+
#endif
1022+
1023+
8741024
/*________________________________________用户ADC1配置_________________________________________________________*/
8751025
#if SYSTEM_ADC1_ENABLE
8761026

STM32F1_HAL_freeRTOS_Framework/SYSTEM/PeriphConfig/PeriphConfig.h

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,33 @@ float Peek_TIM2_Cap_Val(void);
186186
float peek_TIM2_Encoder_Speed(void);
187187
int32_t peek_TIM2_Encoder_Value(void);
188188

189+
/*_______________________________TIM1PWM___________________________________*/
190+
extern TIM_HandleTypeDef TIM1_Handler;
191+
void sys_TIM1PWM_ENABLE(void);
192+
#if STSTEM_TIM1PWM_ENABLE
193+
#define TIM1PWM_Channel_1 1
194+
#define TIM1PWM_Channel_2 2
195+
#define TIM1PWM_Channel_3 3
196+
#define TIM1PWM_Channel_4 4
197+
void TIM1_set_Channel_Pulse(u8 channel,float percent);
198+
#endif
199+
200+
/*_______________________________TIM6___________________________________*/
201+
void sys_TIM6_ENABLE(void);
202+
extern TIM_HandleTypeDef TIM6_Handler;
203+
#if (STSTEM_TIM6_ENABLE) && ((STM32F103xG) || (STM32F103xE))
204+
205+
206+
#endif
207+
/*_______________________________TIM7___________________________________*/
208+
void sys_TIM7_ENABLE(void);
209+
extern TIM_HandleTypeDef TIM7_Handler;
210+
#if (STSTEM_TIM7_ENABLE) && ((STM32F103xG) || (STM32F103xE))
211+
212+
213+
#endif
214+
215+
189216
/*_______________________________ADC1___________________________________*/
190217
extern ADC_HandleTypeDef ADC1_Handler;
191218
void sys_ADC1_ENABLE(void);

STM32F1_HAL_freeRTOS_Framework/SYSTEM/malloc/malloc.c

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,7 @@
11
#include "malloc.h"
2-
//////////////////////////////////////////////////////////////////////////////////
3-
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
4-
//ALIENTEK战舰STM32开发板V3
5-
//内存管理 驱动代码
6-
//正点原子@ALIENTEK
7-
//技术论坛:www.openedv.com
8-
//修改日期:2019/9/19
9-
//版本:V1.0
10-
//版权所有,盗版必究。
11-
//Copyright(C) 广州市星翼电子科技有限公司 2009-2019
12-
//All rights reserved
13-
//////////////////////////////////////////////////////////////////////////////////
2+
143
/*此文件借鉴 ALIENTEK战舰STM32开发板V3 内存管理 的源代码*/
4+
/*后来又发现,硬石的YSFx系列开发板历程里的内存管理源代码和这里的几乎一模一样,而且都说自己是作者...*/
155

166
//内存池(32字节对齐)(真正储存东西的地方)
177
__align(32) u8 mem1base[InrRAM_MAX_SIZE]; //内部SRAM内存池

STM32F1_HAL_freeRTOS_Framework/SYSTEM/malloc/malloc.h

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,29 +2,17 @@
22
#define __MALLOC_H
33
#include "sys.h"
44

5-
//////////////////////////////////////////////////////////////////////////////////
6-
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
7-
//ALIENTEK战舰STM32开发板V3
8-
//内存管理 驱动代码
9-
//正点原子@ALIENTEK
10-
//技术论坛:www.openedv.com
11-
//修改日期:2019/9/19
12-
//版本:V1.0
13-
//版权所有,盗版必究。
14-
//Copyright(C) 广州市星翼电子科技有限公司 2009-2019
15-
//All rights reserved
16-
//////////////////////////////////////////////////////////////////////////////////
175
/*此文件借鉴 ALIENTEK战舰STM32开发板V3 内存管理 的源代码*/
6+
/*后来又发现,硬石的YSFx系列开发板历程里的内存管理源代码和这里的几乎一模一样,而且都说自己是作者...*/
187

198
/*______________________用户配置___________________________*/
209
#define RAM_Num 2 //定义支持的SRAM块数
2110

2211
/*______________________用户配置___________________________*/
23-
//定义两个内存池
12+
//定义内存池标志
2413
#define InrRAM 0 //内部内存池
25-
#if ((SYSTEM_FSMC_ENABLE) && (SYSTEM_FSMC_use4SRAM)) && ((STM32F103xG) || (STM32F103xE))
2614
#define ExRAM1 1 //外部内存池1
27-
#endif
15+
#define ExRAM2 2 //外部内存池2(保留项,暂时没用到)
2816

2917
/*______________________用户配置___________________________*/
3018
//InrRAM内存参数设定,InrRAM完全处于内部SRAM里面

0 commit comments

Comments
 (0)