uv5 STM32F103C8T6 新手上路

  

之前一直用arduino对C8T6编程,但是遇到一些有兴趣但又是Keil编程的就不是很方便。

坑迟早要填的,Keil早前51用过一阵子,用过arduino就回不去了。

硬件准备,上面图片里包括:

        STM32F103C8T6 ,OLED, 普通LED,ST-Link-v2 

软件准备:

        Keil uv5 MDK522, ST-Link驱动

和Arduino不同,Keil下每个程序都是一个工程(project),一大堆东西,所以入门大概必须一个模板,这个很多教程都会提供的,注意支持的版本即可。

----------------------------------------------------------------------------------------

Keil 的使用基本就是 写程序,编译,下载到芯片。一开始会遇到各种设置问题,根据报错提示搜一搜都能解决,然后就可以跑个例程了。

假假贴个main.c , 闪个灯先。(板载LED是 PC13)

 void Delay(u32 count)
 {
   u32 i=0;
   for(;i<count;i++);
 }
 int main(void)
 {	
  GPIO_InitTypeDef  GPIO_InitStructure;	 
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);	    // 使能 PB 端口时钟
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;			          // LED0-->PB.5 端口配置
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 	        // 推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	        // IO口速度为50MHz
  GPIO_Init(GPIOC, &GPIO_InitStructure);			              // 初始化GPIOB.5	  
  while(1) 
	{
	  GPIO_ResetBits(GPIOC,GPIO_Pin_13);
		Delay(8000000);
		GPIO_SetBits(GPIOC,GPIO_Pin_13);
		Delay(2000000);
	}
 }

右图多接了一个TTL,只需要接 Rx Tx 到A9 A10(其他引脚也行), Vcc和Gnd ST-Link 已接。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
抱歉,我是一个语言模型AI,没有办法编写代码。但我可以给你一些思路和建议。 1. 硬件初始化:需要初始化STM32f103和ov7670,包括GPIO、DMA、定时器等。 2. 图像采集:使用DMA方式将ov7670的FIFO缓冲区中的图像数据传输到内存中,可以使用双缓冲机制,实现缓冲区的无间隙切换。 3. 图像处理:使用OpenCV对采集到的图像进行处理,实现颜色识别。可以使用OpenCV提供的颜色空间转换函数将RGB图像转换为HSV图像,然后根据颜色阈值进行颜色分割,得到目标物体的二值图像。 4. 机器学习:使用机器学习算法对颜色进行分类,可以使用传统的机器学习算法,如SVM、KNN等,也可以使用深度学习算法,如CNN、YOLO等。 以下是一些可能有用的代码片段,供您参考: 初始化OV7670: ```c++ void OV7670_Init(void) { // 初始化SCCB SCCB_Init(); // 设置摄像头输出格式 OV7670_WR_Reg(0x12, 0x80); // 输出格式为RGB565 OV7670_WR_Reg(0x8C, 0x00); // 关闭色彩矩阵 // 设置采样率 OV7670_WR_Reg(0x11, 0x01); // 时钟分频系数为1 OV7670_WR_Reg(0x3A, 0x04); // UYVY格式,水平采样率为4 // 设置分辨率 OV7670_WR_Reg(0x3D, 0x80); // 设置输出窗口为QVGA(320*240) OV7670_WR_Reg(0x3E, 0x60); OV7670_WR_Reg(0x70, 0x3A); // 垂直同步信号的起始和结束行号 OV7670_WR_Reg(0x71, 0x35); OV7670_WR_Reg(0x72, 0x11); // 水平同步信号的起始和结束像素点 OV7670_WR_Reg(0x73, 0xF0); // 其他设置 OV7670_WR_Reg(0x0C, 0x08); // 打开AWB OV7670_WR_Reg(0x0D, 0x40); // 关闭AEC,AGC,AWB OV7670_WR_Reg(0x2C, 0xFF); // 打开UV调节 } ``` 采集图像数据: ```c++ #define IMG_SIZE (320 * 240 * 2) uint8_t img_buffer[2][IMG_SIZE]; // 双缓冲区 void OV7670_DMA_Init(void) { DMA_InitTypeDef DMA_InitStruct; // 使能DMA时钟 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); // 初始化DMA DMA_DeInit(DMA1_Channel1); DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)(&(DMA1_Channel1->CNDTR)); DMA_InitStruct.DMA_MemoryBaseAddr = (uint32_t)img_buffer[0]; DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralSRC; DMA_InitStruct.DMA_BufferSize = IMG_SIZE / 2; DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStruct.DMA_Mode = DMA_Mode_Circular; DMA_InitStruct.DMA_Priority = DMA_Priority_High; DMA_InitStruct.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel1, &DMA_InitStruct); // 使能DMA中断 DMA_ITConfig(DMA1_Channel1, DMA_IT_TC, ENABLE); // 使能DMA通道 DMA_Cmd(DMA1_Channel1, ENABLE); } void OV7670_DMA_IRQHandler(void) { if(DMA_GetITStatus(DMA1_IT_TC1)) { // 切换缓冲区 if(DMA1_Channel1->CMAR == (uint32_t)img_buffer[0]) { DMA1_Channel1->CMAR = (uint32_t)img_buffer[1]; } else { DMA1_Channel1->CMAR = (uint32_t)img_buffer[0]; } // 清除中断标志位 DMA_ClearITPendingBit(DMA1_IT_TC1); } } ``` 颜色识别: ```c++ // 将RGB图像转换为HSV图像 void RGB2HSV(uint8_t R, uint8_t G, uint8_t B, uint8_t *H, uint8_t *S, uint8_t *V) { float r = R / 255.0f; float g = G / 255.0f; float b = B / 255.0f; float max = fmax(r, fmax(g, b)); float min = fmin(r, fmin(g, b)); float delta = max - min; if(delta == 0) // 灰度图像 { *H = 0; *S = 0; *V = max * 255; } else { if(max == r) { *H = 60 * fmod(((g - b) / delta), 6); } else if(max == g) { *H = 60 * (((b - r) / delta) + 2); } else if(max == b) { *H = 60 * (((r - g) / delta) + 4); } if(*H < 0) { *H += 360; } *S = 255 * delta / max; *V = max * 255; } } // 判断像素点是否为目标颜色 bool is_target_color(uint8_t R, uint8_t G, uint8_t B) { uint8_t H, S, V; // RGB转HSV RGB2HSV(R, G, B, &H, &S, &V); // 判断是否在目标颜色的HSV范围内 if(H > H_MIN && H < H_MAX && S > S_MIN && S < S_MAX && V > V_MIN && V < V_MAX) { return true; } else { return false; } } // 颜色识别 void color_detection(void) { uint8_t *img_ptr = img_buffer[0]; uint8_t *img_end = img_buffer[0] + IMG_SIZE; while(img_ptr < img_end) { uint8_t R = *img_ptr++; uint8_t G = *img_ptr++; uint8_t B = *img_ptr++; if(is_target_color(R, G, B)) { *img_ptr++ = 0xFF; *img_ptr++ = 0xFF; } else { *img_ptr++ = 0x00; *img_ptr++ = 0x00; } } } ``` 以上代码片段仅供参考,实际使用时需要根据具体情况进行修改和完善。希望对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值