rt_thread&finsh控制台移植STM32

编程

      先说一下感受吧,第一次有想搞应用系统的想法,初步看了很多嵌入式系统,俗称RTOS,包括UC/OS/,freeRTOS,liteOS,rt_thread。虽然都不是很懂,但是有必要学习一下,最终还是选择了rt_thread,说是国产的,也说是学习比较容易的,硬件要求低的。反正一大推理由,我也不知道。选了就选吧。

      正题:

   A.  先来说一下我的硬件:STM32F103RCXX, 开发板随意,只要你有可以串口通信,还连接控制一颗灯即可)

                                 软件:WIN10, 这个应该不是很重要了吧。

  第一随文就节点是,我已经移植了,rt_thread_nano. 且已经基本可以点亮一颗灯,和串口。且还挂载了finsh组件。

      说一下步骤吧。

      1. cubeMX 生成起码项目,启动UART1和PA8.  这些看你们硬件。具体如下图操作如图:

     

     说说这个东西吧,其实建立工程有好多种方法,我发现这个是最简单的,但是需要cubeMX工具。如果你想从事STM32工作的,

      还得多学习用库建立的方法,那些我就不描述了。百度一下一大把。主要是HAL库建立工程。

  2. 建立好生成工程后打开如下几步骤,如下介绍。

     

 

  

  1 #include "main.h"

2 #include <rtthread.h>

3

4

5 #ifndef RT_USING_HEAP

6 rt_err_t hdle1;

7staticstruct rt_thread led_thread ;

8staticchar led_stack[256] ;

9#else

10static rt_thread_t led_thread ;

11#endif

12

13UART_HandleTypeDef huart1;

14

15

16void led_entry(void *parameter)

17{

18while(1)

19 {

20 HAL_GPIO_WritePin(GPIOA,GPIO_PIN_8,GPIO_PIN_RESET);

21 rt_thread_mdelay(500);

22

23 HAL_GPIO_WritePin(GPIOA,GPIO_PIN_8,GPIO_PIN_SET);

24 rt_thread_mdelay(500);

25 }

26}

27

28

29

30/* USER CODE END PV */

31

32void SystemClock_Config(void);

33staticvoid MX_GPIO_Init(void);

34staticvoid MX_USART1_UART_Init(void);

35

36int main(void)

37{

38 HAL_Init();

39

40 SystemClock_Config();

41 MX_GPIO_Init();

42 MX_USART1_UART_Init();

43while (1)

44 {

45 rt_thread_mdelay(100) ;

46 }

47}

48void SystemClock_Config(void)

49{

50 RCC_OscInitTypeDef RCC_OscInitStruct = {0};

51 RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

52

53/** Initializes the RCC Oscillators according to the specified parameters

54 * in the RCC_OscInitTypeDef structure.

55*/

56 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;

57 RCC_OscInitStruct.HSIState = RCC_HSI_ON;

58 RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;

59 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;

60if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)

61 {

62 Error_Handler();

63 }

64/** Initializes the CPU, AHB and APB buses clocks

65*/

66 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK

67 |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;

68 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;

69 RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;

70 RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;

71 RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

72

73if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)

74 {

75 Error_Handler();

76 }

77}

78

79

80staticvoid MX_USART1_UART_Init(void)

81{

82

83/* USER CODE BEGIN USART1_Init 0 */

84

85/* USER CODE END USART1_Init 0 */

86

87/* USER CODE BEGIN USART1_Init 1 */

88

89/* USER CODE END USART1_Init 1 */

90 huart1.Instance = USART1;

91 huart1.Init.BaudRate = 115200;

92 huart1.Init.WordLength = UART_WORDLENGTH_8B;

93 huart1.Init.StopBits = UART_STOPBITS_1;

94 huart1.Init.Parity = UART_PARITY_NONE;

95 huart1.Init.Mode = UART_MODE_TX_RX;

96 huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;

97 huart1.Init.OverSampling = UART_OVERSAMPLING_16;

98if (HAL_UART_Init(&huart1) != HAL_OK)

99 {

100 Error_Handler();

101 }

102/* USER CODE BEGIN USART1_Init 2 */

103

104/* USER CODE END USART1_Init 2 */

105

106}

107

108

109staticvoid MX_GPIO_Init(void)

110{

111 GPIO_InitTypeDef GPIO_InitStruct = {0};

112

113/* GPIO Ports Clock Enable */

114 __HAL_RCC_GPIOA_CLK_ENABLE();

115

116/*Configure GPIO pin Output Level */

117 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET);

118

119/*Configure GPIO pin : PA8 */

120 GPIO_InitStruct.Pin = GPIO_PIN_8;

121 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

122 GPIO_InitStruct.Pull = GPIO_NOPULL;

123 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

124 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

125

126}

127

128/* USER CODE BEGIN 4 */

129

130void rt_hw_console_output(constchar *str)

131{

132 rt_size_t i = 0, size = 0;

133char a = "";

134

135 __HAL_UNLOCK(&huart1);

136

137 size = rt_strlen(str);

138for (i = 0; i < size; i++)

139 {

140if (*(str + i) == "

")

141 {

142 HAL_UART_Transmit(&huart1, (uint8_t *)&a, 1, 1);

143 }

144 HAL_UART_Transmit(&huart1, (uint8_t *)(str + i), 1, 1);

145 }

146}

147char rt_hw_console_getchar(void)

148{

149int ch = -1;

150

151if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_RXNE) != RESET)

152 {

153 ch = huart1.Instance->DR & 0xff;

154 }

155else

156 {

157if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_ORE) != RESET)

158 {

159 __HAL_UART_CLEAR_OREFLAG(&huart1);

160 }

161 rt_thread_mdelay(10);

162 }

163return ch;

164}

165

166void led_start(void)

167{

168 #ifndef RT_USING_HEAP

169 hdle1 = rt_thread_init(&led_thread,

170"ledshine",

171 led_entry,

172 RT_NULL,

173 &led_stack[0],

174sizeof(led_stack),

175 RT_THREAD_PRIORITY_MAX-2,

17620);

177if(hdle1 != RT_EOK)

178 {

179 rt_thread_startup(&led_thread) ;

180

181 }

182#else

183if(led_thread == RT_NULL)

184 {

185 led_thread = rt_thread_create("ledshine",

186 led_entry,

187 RT_NULL,

188128,

189 RT_THREAD_PRIORITY_MAX-2,

19020);

191if(led_thread != RT_NULL)

192 {

193 rt_thread_startup(led_thread) ;

194 }

195 }

196

197#endif

198

199}

200void led_exit(void)

201{

202if(led_thread != RT_NULL)

203 {

204 #ifdef RT_USING_HEAP

205 rt_thread_delete(led_thread) ;//

206 led_thread = RT_NULL ;

207#endif

208 }

209}

210

211INIT_BOARD_EXPORT(MX_USART1_UART_Init) ;

212MSH_CMD_EXPORT(led_start,ledon) ;

213MSH_CMD_EXPORT(led_exit,ledexit) ;

214

215/* USER CODE END 4 */

216

217void Error_Handler(void)

218{

219/* USER CODE BEGIN Error_Handler_Debug */

220/* User can add his own implementation to report the HAL error return state */

221 __disable_irq();

222while (1)

223 {

224 }

225/* USER CODE END Error_Handler_Debug */

226}

227

228#ifdef USE_FULL_ASSERT

229/**

230 * @brief Reports the name of the source file and the source line number

231 * where the assert_param error has occurred.

232 * @param file: pointer to the source file name

233 * @param line: assert_param error line source number

234 * @retval None

235*/

236void assert_failed(uint8_t *file, uint32_t line)

237{

238/* USER CODE BEGIN 6 */

239/* User can add his own implementation to report the file name and line number,

240 ex: printf("Wrong parameters value: file %s on line %d

", file, line) */

241/* USER CODE END 6 */

242}

243#endif /* USE_FULL_ASSERT */

244

245/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

main函数代码

 

   说明一下:

   a. 我这里分两种建立线程的方式: 使用RT_USING_HEAP.  动态和静态.使用宏#ifndef #else #endif, 这里只有动态才能删除线程。

   b. 增加了两条接收串口和发送数据的函数rt_hw_console_output/rt_hw_console_getchar .   

   c. 增加了两条命令:分别是启动led闪烁线程和关闭led闪烁线程

     MSH_CMD_EXPORT(led_start,ledon) ;

     MSH_CMD_EXPORT(led_exit,ledexit) ;

   d. 串口出事话必须要在启动mian前就初始化:

                  INIT_BOARD_EXPORT(MX_USART1_UART_Init) ; 

   调试:  使用过putty,mobaxterm.但是知道怎么设置,最终选用了xshell。 

    驱动后如下:

    

 

    可以通过help命令来看系统都有什么命令:

    以下我发几个命令给大家看,具体大家自行学习研究。(其实我目前就知道这几个)

 

 

    上图我是还没有驱动led线程,下方我启动线程前、后、关闭后的对比。如下图:

    

 

   总结一下:

         虽然是第一阶段的学习,但是也是从0-1的过程,往下就应该更加简单了,但是需要的时间也越来越多。学习无止境。

         有任何不解和建议QQ:2382213313.

   

 

    

 

以上是 rt_thread&amp;finsh控制台移植STM32 的全部内容, 来源链接: utcz.com/z/519698.html

回到顶部