前一陣子,一位小伙伴咨詢我一款新IC芯片怎么使用,借此機(jī)會(huì)我順便把我日常工作中經(jīng)常用到的一種調(diào)試方法介紹給小伙伴們,希望對(duì)對(duì)大家有所幫助。準(zhǔn)備倉促,文中難免有技術(shù)性錯(cuò)誤,歡迎大家給予指正,并給出好的建議...
前言:
我們?cè)?a target="_blank">單片機(jī)的項(xiàng)目開發(fā)過程中經(jīng)常會(huì)遇到使用新IC芯片的情況,某寶賣家有個(gè)時(shí)候也提供不了對(duì)應(yīng)開發(fā)程序,到網(wǎng)上找資料也找不到;很多初學(xué)者面對(duì)這樣的問題往往束手無策,這里我給大家介紹我經(jīng)常用的其中一種新IC調(diào)試的方法。
因?yàn)檫@個(gè)芯片比較簡(jiǎn)單我這里采用下面步驟進(jìn)行:
第一步: 先用arduino+面包板快速搭建電路驗(yàn)證芯片功能
第二步: 使用STM32CubeIDE快速搭建工程驗(yàn)證在STM32上工作是否正常
Tips :由于我手頭沒有 萬用表 ,這里我使用arduino的模擬電壓采集功能通過串口打印出來作為電位計(jì)的電壓監(jiān)控用。
首先,我們先快速瀏覽芯片數(shù)據(jù)手冊(cè),獲取重要信息
IC型號(hào):TLP0501
電壓范圍:2.7~5.5V
溫度范圍:-40~125℃
通信方式:SPI
阻值:100KΩ
阻值偏差:±20%
該芯片是德州儀器的一款單通道數(shù)字電位計(jì),通信方式是SPI總線,單方向的,即只能控制芯片,不能讀取輸入數(shù)據(jù),下面是數(shù)據(jù)手冊(cè)的具體介紹。
環(huán)境參數(shù):主要包括溫度使用范圍、電壓使用范圍、誤差、溫度漂移以及實(shí)物引腳對(duì)應(yīng)關(guān)系都在這里
環(huán)境參數(shù)
功能框圖:主要介紹該芯片的內(nèi)部組成和工作原理
功能框圖
引腳定義:每個(gè)引腳的功能介紹
引腳定義
SPI通信說明:主要介紹芯片的通信方式,這個(gè)芯片因?yàn)闆]有設(shè)置模式功能,只需要對(duì)芯片直接寫數(shù)據(jù)即可,通信方式與我們所使用的74HC595的方式類似
SPI通信說明
真值對(duì)照表:也就是數(shù)字量對(duì)應(yīng)的實(shí)際電阻值,我這里只截取了一部分,剩下的大家可以自行去參考詳細(xì)手冊(cè)
真值對(duì)照表
對(duì)于要調(diào)通這個(gè)芯片這些介紹基本滿足我們的需求了
芯片模塊的快速制作
在芯片商城上買了兩片回來調(diào)試,芯片購買的費(fèi)用知乎小伙伴給付了
準(zhǔn)備好芯片+轉(zhuǎn)接板
焊接兩塊是為了防止在使用過程中意外弄壞另一塊可以立馬補(bǔ)上,確保調(diào)試正常進(jìn)行而不耽誤太多時(shí)間
焊接好排針,并在供電端加上0.1uF的濾波電容,降低高頻供電干擾
這樣我們的模塊就制作完成了
arduino快速搭建工程:
電路原理圖
電路原理圖
引腳對(duì)應(yīng)關(guān)系:
arduino uno 引腳4 -> CLK
arduino uno 引腳5 -> DIN
arduino uno 引腳6 -> CS
arduino uno 引腳5v -> VCC、VREF
arduino uno 引腳GND -> GND、L
arduino uno 引腳A0 -> VRES_OUT
首先用面包板+杜邦線搭好電路
說明:我在這里使用的供電電壓和數(shù)字電位計(jì)參考電壓都是使用的5V,相應(yīng)的輸出結(jié)果也是在0~5V范圍
然后使用arduino自帶的庫,編寫代碼,再變動(dòng)阻值參數(shù),看下輸出的實(shí)際結(jié)果和真值表是否對(duì)應(yīng)的上
數(shù)值為0x00時(shí)對(duì)應(yīng)的模擬電壓輸出
數(shù)值為0x88時(shí)對(duì)應(yīng)的模擬電壓輸出
數(shù)值為0xFF時(shí)對(duì)應(yīng)的模擬電壓輸出
經(jīng)過驗(yàn)證,在arduino上跑沒有問題,接下來我們準(zhǔn)備在STM32上去運(yùn)行
arduino代碼部分:
/*
AnalogReadSerial
Reads an analog input on pin 0, prints the result to the Serial Monitor.
Graphical representation is available using Serial Plotter (Tools > Serial Plotter menu).
Attach the center pin of a potentiometer to pin A0, and the outside pins to +5V and ground.
This example code is in the public domain.
http://www.arduino.cc/en/Tutorial/AnalogReadSerial
*/
int CS_Pin = 6;
int CLK_Pin = 4;
int DIN_Pin = 5; //這里定義了那三個(gè)腳
// the setup routine runs once when you press reset:
void setup() {
pinMode(CS_Pin,OUTPUT);
pinMode(CLK_Pin,OUTPUT);
pinMode(DIN_Pin,OUTPUT); //讓三個(gè)腳都是輸出狀態(tài)
// initialize serial communication at 9600 bits per second:
Serial.begin(9600);
digitalWrite(CS_Pin,LOW);
shiftOut(DIN_Pin,CLK_Pin,MSBFIRST,0xFF);
digitalWrite(CS_Pin,HIGH);
}
// the loop routine runs over and over again forever:
void loop() {
// read the input on analog pin 0:
int sensorValue = analogRead(A0);
float voltage= sensorValue * (5.0 / 1023.0); //換算成電壓
// print out the value you read:
Serial.println(voltage,DEC);
delay(100); // delay in between reads for stability
}
STM32搭建工程驗(yàn)證
說明:STM32使用的供電電壓和數(shù)字電位計(jì)參考電壓都是3V3,相應(yīng)的輸出結(jié)果也是在0~3V3范圍
電路原理圖
引腳對(duì)應(yīng)關(guān)系:
PA4 -> CLK
PA5 -> DIN
PA6 -> CS
3V3 -> VCC、VREF
arduino uno 引腳GND -> GND、L
arduino uno 引腳A0 -> VRES-OUT
開發(fā)板+面包板搭建電路
用STM32CubeIDE建立一個(gè)工程
配置好PA4、PA5、PA6引腳為輸出
生成代碼,并添加TLP0501的驅(qū)動(dòng)代碼
編譯看運(yùn)行的效果,輸入值為0x55
更改輸入的數(shù)值為0x22,驗(yàn)證是否正確
main函數(shù)代碼部分:
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file : main.c
* @brief : Main program body
******************************************************************************
* @attention
*
* < h2 >< center >? Copyright (c) 2021 STMicroelectronics.
* All rights reserved.< /center >< /h2 >
*
* This software component is licensed by ST under BSD 3-Clause license,
* the "License"; You may not use this file except in compliance with the
* License. You may obtain a copy of the License at:
* opensource.org/licenses/BSD-3-Clause
*
******************************************************************************
*/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
/* USER CODE END PTD */
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
#define TLP0501_DIN_H() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET)
#define TLP0501_DIN_L() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET)
#define TLP0501_CS_H() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET)
#define TLP0501_CS_L() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET)
#define TLP0501_CLK_H() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET)
#define TLP0501_CLK_L() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET)
/* USER CODE END PD */
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
/* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
/* USER CODE BEGIN PFP */
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
void TLP0501_WriteByte( uint8_t data )
{
uint8_t j;
for ( j=8; j >=1; j--)
{
TLP0501_CLK_L();
__NOP();
if(data & 0x80 ){ TLP0501_DIN_H(); }
else { TLP0501_DIN_L(); }
data < <= 1;
TLP0501_CLK_H();
}
}
/* USER CODE END 0 */
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
/* USER CODE BEGIN 2 */
TLP0501_CS_L();
TLP0501_WriteByte(0x22);
TLP0501_CS_H();
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
/**
* @brief System Clock Configuration
* @retval None
*/
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
/** Initializes the RCC Oscillators according to the specified parameters
* in the RCC_OscInitTypeDef structure.
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
/** Initializes the CPU, AHB and APB buses clocks
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
{
Error_Handler();
}
}
/**
* @brief GPIO Initialization Function
* @param None
* @retval None
*/
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOD_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6, GPIO_PIN_RESET);
/*Configure GPIO pins : PA4 PA5 PA6 */
GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
/* USER CODE BEGIN 4 */
/* USER CODE END 4 */
/**
* @brief This function is executed in case of error occurrence.
* @retval None
*/
void Error_Handler(void)
{
/* USER CODE BEGIN Error_Handler_Debug */
/* User can add his own implementation to report the HAL error return state */
/* USER CODE END Error_Handler_Debug */
}
#ifdef USE_FULL_ASSERT
/**
* @brief Reports the name of the source file and the source line number
* where the assert_param error has occurred.
* @param file: pointer to the source file name
* @param line: assert_param error line source number
* @retval None
*/
void assert_failed(uint8_t *file, uint32_t line)
{
/* USER CODE BEGIN 6 */
/* User can add his own implementation to report the file name and line number,
tex: printf("Wrong parameters value: file %s on line %drn", file, line) */
/* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
總結(jié):
1、這里介紹了眾多新IC芯片調(diào)試方式中的一種,后期有機(jī)會(huì)再陸續(xù)介紹其他IC或新模塊的調(diào)試方法。
2、文中只是簡(jiǎn)單的對(duì)芯片進(jìn)行功能測(cè)試,實(shí)際項(xiàng)目中還會(huì)有移植、驅(qū)動(dòng)的可靠性、穩(wěn)定性等測(cè)試工作 。
3、我們要善于運(yùn)用手頭的工具、arduino等快速驗(yàn)證開發(fā)環(huán)境;模塊的快速驗(yàn)證,特別是在項(xiàng)目開發(fā)過程中,時(shí)間就是金錢,對(duì)每一種工具的熟練掌握也是單片機(jī)開發(fā)過程中不可或缺的重要技能。
4、硬件調(diào)試與軟件調(diào)試有很大的區(qū)別,很多時(shí)候是一次性,不可逆轉(zhuǎn)的,不像軟件Ctl+Z可以撤銷;硬件在使用過程中出現(xiàn)意外損壞情況很正常:焊接不當(dāng)、意外插錯(cuò),靜電防護(hù)不到位等等;我們要善于運(yùn)用一些項(xiàng)目技巧,權(quán)衡時(shí)間或花費(fèi);這里之所以選擇焊接兩個(gè)芯片模塊也是為了防止這種意外的發(fā)生而對(duì)調(diào)試造成不必要的時(shí)間耽擱。
-
電路圖
+關(guān)注
關(guān)注
10404文章
10733瀏覽量
541111 -
單片機(jī)
+關(guān)注
關(guān)注
6064文章
44931瀏覽量
647402 -
IC芯片
+關(guān)注
關(guān)注
8文章
254瀏覽量
26946 -
Arduino
+關(guān)注
關(guān)注
189文章
6493瀏覽量
190182 -
面包板
+關(guān)注
關(guān)注
4文章
299瀏覽量
18014
發(fā)布評(píng)論請(qǐng)先 登錄
單片機(jī)串口模塊調(diào)試方法

單片機(jī)如何控制調(diào)試信息輸出
單片機(jī)開發(fā)調(diào)試應(yīng)注意的問題
單片機(jī)最小系統(tǒng)的調(diào)試方法_單片機(jī)最小系統(tǒng)設(shè)計(jì)制作及開發(fā)流程

單片機(jī)程序常用的幾種調(diào)試方法
Keil5創(chuàng)建51單片機(jī)項(xiàng)目中CPU顯示為空

單片機(jī)控制調(diào)試信息輸出的方法

單片機(jī)項(xiàng)目中LED的重要性~

評(píng)論