4.1主程序流程图:
4. 2代码实现,包括必要的注释
/按键初始化函数
5. //PA0.15和PC5 设置成输入 6. void KEY_Init(void) 7. {
6
8. 9.
RCC->APB2ENR|=1<<2; //使能PORTA时钟 RCC->APB2ENR|=1<<4; //使能PORTC时钟
//关闭JTAG,开启SWD
10. JTAG_Set(SWD_ENABLE); 12. GPIOA->CRL|=0X00000008;
11. GPIOA->CRL&=0XFFFFFFF0; //PA0设置成输入 13. GPIOA->CRH&=0X0FFFFFFF; //PA15设置成输入 14. GPIOA->CRH|=0X80000000; 15. GPIOA->ODR|=1<<15;
//PA15上拉,PA0默认下拉
16. GPIOC->CRL&=0XFF0FFFFF; //PC5设置成输入 17. GPIOC->CRL|=0X00800000; 18. GPIOC->ODR|=1<<5; 19. } //按键处理函数
20. u8 KEY_Scan(u8 mode) 21. {
22. static u8 key_up=1;//按键按松开标志 23. if(mode)key_up=1; //支持连按 25. { 26. 27. 28. 29. 30.
delay_ms(10);//去抖动 key_up=0;
if(KEY0==0)return KEY0_PRES; else if(KEY1==0)return KEY1_PRES; else if(WK_UP==1)return WKUP_PRES;
24. if(key_up&&(KEY0==0||KEY1==0||WK_UP==1))
//PC5上拉
31. }else if(KEY0==1&&KEY1==1&&WK_UP==0)key_up=1; 32. return 0;// 无按键按下 33. }
//外部中断定义及初始化程序 //外部中断0服务程序
34. void EXTI0_IRQHandler(void) 35. { int speed;
36. delay_ms(10); //消抖 37. if(WK_UP==1) //WK_UP按键 38. { 39. 40. 41. 42. 43. 44. } 46. }
//外部中断9~5服务程序
47. void EXTI9_5_IRQHandler(void)
7
//LED=!LED; if(speed==100000) else
{speed=100000;LED=1;}
{LED=0;speed=20;}
45. EXTI->PR=1<<0; //清除LINE0上的中断标志位
48. {
//按键0
49. delay_ms(10); //消抖 50. if(KEY0==0) 51. {LED=0;speed=3;}
52. EXTI->PR=1<<5; //清除LINE5上的中断标志位 53. }
54. //外部中断15~10服务程序 55. void EXTI15_10_IRQHandler(void) 56. {
//按键1
57. delay_ms(10); //消抖 58. if(KEY1==0) 59. {LED=0;speed=7;}
60. EXTI->PR=1<<15; //清除LINE15上的中断标志位 61. }
62. //外部中断初始化程序
63. //初始化PA0,PC5,PA15为中断输入. 64. void EXTI_Init(void) 65. {
66. KEY_Init();
67. Ex_NVIC_Config(GPIO_A,0,RTIR); 68. Ex_NVIC_Config(GPIO_C,5,FTIR);
69. Ex_NVIC_Config(GPIO_A,15,FTIR); 70. MY_NVIC_Init(2,2,EXTI0_IRQn,2); 71. MY_NVIC_Init(2,1,EXTI9_5_IRQn,2); 72. MY_NVIC_Init(2,0,EXTI15_10_IRQn,2); 73. }
//步进点击初始化函数
74. void MOTOR_Init(void) 75. {
76. RCC->APB2ENR|=1<<2; //使能PORTA时钟 77. RCC->APB2ENR|=1<<5; //使能PORTD时钟 78. GPIOA->CRL&=0X0000FFFF;
79. GPIOA->CRL|=0X11110000;//PA8 推挽输出 PA2 LED推挽输出 80. GPIOA->CRH&=0XFFFFFFF0; 81. GPIOA->CRH|=0X00000001; 82. GPIOA->ODR|=1<<8; 84. GPIOA->ODR|=1<<5;
85. GPIOA->ODR|=1<<6; //PA8 输出高 86. GPIOA->ODR|=1<<7;
87. GPIOD->CRL&=0XFFFFF0FF; 88. GPIOD->CRL|=0X00000300;//PD.2 89. GPIOD->ODR|=1<<2; //PD.2 90. }
8
83. GPIOA->ODR|=1<<4; //PA8 输出高
//上升沿触发 //下降沿触发 //下降沿触发
//步进点击停止函数
91. void MOTOR_Stop(void) 92. {
93. MOTOR1=0; 94. MOTOR2=0; 95. MOTOR3=0; 96. MOTOR4=0; 97. int main(void) 98. {
99. Stm32_Clock_Init(9);//系统时钟设置 100. delay_init(72); //延时初始化 101. uart_init(72,9600); //串口初始化 102. MOTOR_Init(); 103. EXTI_Init(); 104. speed=100000; 105. MOTOR_Stop(); 106. while(1) 107. { 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 122. 124. 125. 126. 127. 128. 129. } 130. }
printf(\//delay_ms(1000); {delay_ms(100);}
MOTOR1=1;MOTOR2=0;MOTOR3=0;MOTOR4=0; delay_ms(speed);
MOTOR1=1;MOTOR2=1;MOTOR3=0;MOTOR4=0; delay_ms(speed);
MOTOR1=0;MOTOR2=1;MOTOR3=0;MOTOR4=0; delay_ms(speed);
MOTOR1=0;MOTOR2=1;MOTOR3=1;MOTOR4=0; LED8=!LED8; delay_ms(speed); delay_ms(speed); delay_ms(speed);
MOTOR1=0;MOTOR2=0;MOTOR3=0;MOTOR4=1; delay_ms(speed);
MOTOR1=1;MOTOR2=0;MOTOR3=0;MOTOR4=1; delay_ms(speed);
while(speed==100000)
//motor stop
//初始化motor //外部中断初始化
121. MOTOR1=0;MOTOR2=0;MOTOR3=1;MOTOR4=0; 123. MOTOR1=0;MOTOR2=0;MOTOR3=1;MOTOR4=1;
五、 实验测试、结果分析
9
实验结果如图:
结果分析:
实验结果基本完成本课题实验要求,实现的步进电机的的运转。但由于时间关系未能加入ADC模块,实现电机的转向等的控制。
六、 总结、心得体会
通过此次课程设计,使得我对ARMSTM32的基本知识有了深一步的认识,同时增
加了嵌入式开发的经验。在课设过程中遇到了一些小麻烦,就是调试的过程中,由于编程基础不是很深厚,检测不出问题,实现不了要求,后来在同学的帮忙下,改了ministm32的io端口,才成功实现的;这也让我懂得,做技术的一定要多实践,光有理论是不行的。
七、 主要参考文献
《嵌入式系统原理、设计及开发》清华大学出版社
《ARM嵌入式系统基础教程》 北京航空航天大学出版社 STM32不完全手册V2.3 周立功ARM培训精华(全套)
谭浩强C程序设计清华大学出版社
10